1. 本文章的必要性
C++的存在像一把瑞士軍刀情组,繼承了C語(yǔ)言的設(shè)計(jì)理念——“充分相信程序員”燥筷,幾乎將所有的底層細(xì)節(jié)都暴露在外箩祥,程序員可以自由控制。在最近詳細(xì)學(xué)習(xí)Golang的過(guò)程中肆氓,發(fā)現(xiàn)Golang中的常用結(jié)構(gòu)的設(shè)計(jì)理念與C++截然不同袍祖,為許多常用的操作都提供了語(yǔ)言設(shè)計(jì)者所認(rèn)為的“最佳實(shí)踐”。本文章僅討論Golang中數(shù)組和切片谢揪。
2. Golang數(shù)組 和 C++數(shù)組(Array)
例子
C++ version
// const常量長(zhǎng)度初始化
// 顯然非常量無(wú)法作為初始化的長(zhǎng)度蕉陋,因?yàn)榫幾g器在編譯期無(wú)法確定要為此數(shù)組分配的內(nèi)存長(zhǎng)度
const int len = 10;
int cpp_arr[len];
// 初始化賦值
int cpp_arr[] = {1, 2, 3, 4, 5};
Golang version
// const常量長(zhǎng)度初始化
// 顯然非常量無(wú)法作為初始化的長(zhǎng)度,理由同上
const len := 10
var golang_arr [len]int
// 初始化賦值
golang_arr := [...]int{1, 2, 3, 4, 5}
// Golang額外提供了語(yǔ)法拨扶,用于初始化數(shù)組為同一元素
// 將golang_arr初始化為具有100個(gè)元素-1的數(shù)組
golang_arr := [...]int{100:-1}
內(nèi)存模型
兩者一樣凳鬓,都是線性的內(nèi)存結(jié)構(gòu)。數(shù)組的本質(zhì)患民,即為編譯器在編譯期在數(shù)據(jù)段分配常量長(zhǎng)度的內(nèi)存缩举,再填充上指定的數(shù)據(jù)。從這方面很容易理解匹颤,兩者的數(shù)組的長(zhǎng)度是不容許修改的蚁孔。
參數(shù)傳遞
Linux進(jìn)程內(nèi)存模型
C++ version
C++的數(shù)組傳參都只能靠指針
但對(duì)于指針的移動(dòng)偏移無(wú)任何限制,只能靠程序員手動(dòng)管理惋嚎,如果讀寫(xiě)越界杠氢,可能會(huì)破壞堆棧
int passArray(int arr[])
{
// 合法
arr[0] = 0;
// 不合法!可能會(huì)破壞進(jìn)程地址空間中的內(nèi)存布局
arr[-1000] = 0;
}
int main()
{
int arr[] = {1, 2, 3, 4, 5};
passArray(&arr[0]);
return 0;
}
golang version
// 通過(guò)改變ptr的指向另伍,將ptr所指的內(nèi)存置為空
// 原來(lái)的內(nèi)存鼻百,GC可通過(guò)引用計(jì)數(shù)探測(cè),將其釋放
func passArrayByPointer(ptr *[32]int) {
*ptr = [32]int{}
}
// 無(wú)效摆尝,只是對(duì)拷貝進(jìn)行了一次賦值
func passArrayByValue(arr [32]int) {
arr = [32]int{}
}
- Golang對(duì)C++傳遞數(shù)組進(jìn)行了限制和優(yōu)化温艇,將數(shù)組類型作為函數(shù)的形參時(shí),必須顯式的指定該數(shù)組的長(zhǎng)度堕汞。在編譯期勺爱,編譯器也會(huì)對(duì)傳入數(shù)組的長(zhǎng)度與聲明的長(zhǎng)度進(jìn)行比對(duì),如果不相等則無(wú)法編譯通過(guò)讯检。
- 和其他高級(jí)語(yǔ)言不同(比如Java)琐鲁,語(yǔ)言中內(nèi)置的類型有的為引用類型(在作為函數(shù)參數(shù)時(shí)直接傳遞引用),有的為值類型(在作為函數(shù)參數(shù)時(shí)傳遞一份拷貝)人灼,Golang在這方面引入了指針围段,可以自由控制給函數(shù)傳遞的數(shù)組是拷貝,還是指針(這是傳參時(shí)投放,與C++最大的不同)
總結(jié)
異
- 語(yǔ)法格式不同(廢話)
- 作為參數(shù)傳遞時(shí)奈泪,長(zhǎng)度Golang有嚴(yán)格的長(zhǎng)度檢查機(jī)制,防止寫(xiě)壞內(nèi)存
- Golang中的數(shù)組是值語(yǔ)義,數(shù)組名即代表整個(gè)數(shù)組涝桅,而不像C/C++隱含為第一個(gè)元素的地址
同
- 內(nèi)存布局一致
- 分配特性一致拜姿,即數(shù)組長(zhǎng)度在編譯期即確定,無(wú)法改變