
最近寫程序的時(shí)候,突然想到了這個(gè)問(wèn)題:在C++中數(shù)組的長(zhǎng)度有限制嗎?我覺得肯定是有的,但限制是多少呢?經(jīng)過(guò)了好長(zhǎng)時(shí)間,我才勉強(qiáng)總結(jié)了一個(gè)答案。
宏觀上的限制因素
首先,如果要確定一個(gè)數(shù)組的最大長(zhǎng)度,我們需要知道它的數(shù)據(jù)類型,因此,數(shù)組的數(shù)據(jù)類型是其中一個(gè)限制因素。因?yàn)椴煌瑪?shù)據(jù)類型的元素大小不同。很顯然(我們假設(shè)
int為4字節(jié),char為1字節(jié)),數(shù)據(jù)類型為char的數(shù)組的最大長(zhǎng)度是類型為int的數(shù)組的4倍。另外,我們不難想到,大小(size)的數(shù)據(jù)類型,也就是數(shù)組下標(biāo)的數(shù)據(jù)類型,其實(shí)也是一個(gè)限制因素。在C/C++中,數(shù)組下標(biāo)的類型是
std::size_t,因此數(shù)組的大小首先不能超過(guò)size_t所能表示的大小。這個(gè)數(shù)據(jù)類型是在庫(kù)文件stdio.h中通過(guò)typedef聲明的,對(duì)于32位程序它被定義為unsighed int,對(duì)于64位程序定義為unsigned long。前者能表示的最大大小為232-1,后者為264-1。然后,我又想到了物理內(nèi)存的大小。這一點(diǎn)不用細(xì)說(shuō),因?yàn)槌绦蜻\(yùn)行時(shí)一旦超過(guò)物理內(nèi)存的大小,這個(gè)程序就會(huì)立刻崩潰。
微觀上的限制因素
上面幾點(diǎn)都是比較籠統(tǒng)的限制,我們換一個(gè)高大上的表達(dá)——宏觀上的限制因素。下面,我們介紹幾個(gè)微觀上的限制因素。
-
大家應(yīng)該都知道,數(shù)組的分配方式大概有兩種方式:靜態(tài)分配和動(dòng)態(tài)分配。再具體點(diǎn)兒的話,根據(jù)數(shù)組聲明的位置,我們可以將數(shù)組分為局部數(shù)組和全局?jǐn)?shù)組。這樣討論的話,就復(fù)雜了,我們暫時(shí)可以將數(shù)組分為四類(只是筆者本人這樣劃分,不知道官方是否有這樣的分類):靜態(tài)分配的局部數(shù)組、動(dòng)態(tài)分配的局部數(shù)組、靜態(tài)分配的全局數(shù)組、動(dòng)態(tài)分配的全局數(shù)組。
- 第一種數(shù)組分配時(shí),使用的是棧上的空間,因此靜態(tài)分配得到的局部數(shù)組的大小受限于棧的大小。具體來(lái)說(shuō)是數(shù)組所在函數(shù)棧幀的大小,當(dāng)然棧幀的大小肯定不能超過(guò)棧的大小。如果你對(duì)編譯器的使用比較熟悉或者你閱讀過(guò)編譯器文檔的話,你應(yīng)該知道如何調(diào)整棧幀的大小限制。在WINDOWS下,棧的大小是2M(也有的說(shuō)是1M,總之是一個(gè)編譯時(shí)就確定的常數(shù)),如果申請(qǐng)的空間超過(guò)棧的剩余空間時(shí),將會(huì)提示溢出。
- 對(duì)于第二種數(shù)組和第四種數(shù)組,我覺得應(yīng)該劃分為一類。本質(zhì)上它們都是在堆上分配空間,因此它們的大小受限于堆的大小。堆是不連續(xù)的內(nèi)存區(qū)域,堆的大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存,因此堆的大小一般都比較大。
- 至于第三種數(shù)組,我們知道它是在靜態(tài)存儲(chǔ)區(qū)分配內(nèi)存空間,因此大小自然受限于靜態(tài)存儲(chǔ)區(qū)的大小,也叫做BSS(Block Started by Symbol),在匯編語(yǔ)言中,我么也稱之為數(shù)據(jù)段。目前我還不太清楚靜態(tài)存儲(chǔ)區(qū)的大小限制,我在我的電腦(Core i3-3110M, 內(nèi)存8GB)上做過(guò)實(shí)驗(yàn)發(fā)現(xiàn)我所能分配的最大大小大約為剩余內(nèi)存的1/2。網(wǎng)上有這樣說(shuō)的:“你的常量有多大就多大”,但是還有待考證。
Note:關(guān)于棧幀的概念可以參考《深入理解計(jì)算機(jī)系統(tǒng)》這本書,或者其他關(guān)于計(jì)算機(jī)體系結(jié)構(gòu)的資料。
注:本文遷移自我的csdn博客,具體地址為:https://blog.csdn.net/github_30605157/article/details/57084216。
參考資料
- stackoverflow.com:Is there a max array length limit in C++?
- cppblog.com:靜態(tài)存儲(chǔ)區(qū)的大小
- 《深入理解計(jì)算機(jī)系統(tǒng)》第三版,機(jī)械工業(yè)出版社