C++/Golang的數(shù)組類型異同

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é)

  1. 語(yǔ)法格式不同(廢話)
  2. 作為參數(shù)傳遞時(shí)奈泪,長(zhǎng)度Golang有嚴(yán)格的長(zhǎng)度檢查機(jī)制,防止寫(xiě)壞內(nèi)存
  3. Golang中的數(shù)組是值語(yǔ)義,數(shù)組名即代表整個(gè)數(shù)組涝桅,而不像C/C++隱含為第一個(gè)元素的地址

  1. 內(nèi)存布局一致
  2. 分配特性一致拜姿,即數(shù)組長(zhǎng)度在編譯期即確定,無(wú)法改變
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冯遂,一起剝皮案震驚了整個(gè)濱河市砾隅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌债蜜,老刑警劉巖晴埂,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異寻定,居然都是意外死亡儒洛,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)狼速,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)琅锻,“玉大人,你說(shuō)我怎么就攤上這事向胡∧张睿” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵僵芹,是天一觀的道長(zhǎng)处硬。 經(jīng)常有香客問(wèn)我,道長(zhǎng)拇派,這世上最難降的妖魔是什么荷辕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮件豌,結(jié)果婚禮上疮方,老公的妹妹穿的比我還像新娘。我一直安慰自己茧彤,他們只是感情好骡显,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著曾掂,像睡著了一般惫谤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上遭殉,一...
    開(kāi)封第一講書(shū)人閱讀 52,158評(píng)論 1 308
  • 那天石挂,我揣著相機(jī)與錄音,去河邊找鬼险污。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蛔糯。 我是一名探鬼主播拯腮,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蚁飒!你這毒婦竟也來(lái)了动壤?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤淮逻,失蹤者是張志新(化名)和其女友劉穎琼懊,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體爬早,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哼丈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了筛严。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片醉旦。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖桨啃,靈堂內(nèi)的尸體忽然破棺而出车胡,到底是詐尸還是另有隱情,我是刑警寧澤照瘾,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布匈棘,位于F島的核電站,受9級(jí)特大地震影響析命,放射性物質(zhì)發(fā)生泄漏羹饰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一碳却、第九天 我趴在偏房一處隱蔽的房頂上張望队秩。 院中可真熱鬧,春花似錦昼浦、人聲如沸馍资。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鸟蟹。三九已至,卻和暖如春使兔,著一層夾襖步出監(jiān)牢的瞬間建钥,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工虐沥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熊经,地道東北人泽艘。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像镐依,于是被迫代替她去往敵國(guó)和親匹涮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359