簡體   English   中英

在堆上創建靜態數組?

[英]Creating a static array on the heap?

我需要創建一個非常大的數組。 我們說50兆字節。

我可以安全地將其創建為普通的靜態數組嗎? 編譯器會將它放在堆棧上(可能導致堆棧溢出),還是它足夠智能將它放在堆上?

如果沒有辦法這樣做,有沒有一種簡單的方法可以在程序啟動時使用malloc或“new”,但在程序結束時自動釋放它?

據我了解,靜態變量不會存在於堆棧中。 如果他們這樣做了,當他們彈出他們居住的堆棧框架時他們會去哪里? 靜態函數變量需要在調用之間保持其狀態,因此邏輯上,靜態數據應保留在堆上。

此外,當程序結束時, 一切都會自動解除分配。

這樣做的簡單方法是使用std :: vector

std::vector   data;
data.reserve(<Number of Elements);

或者可能是std :: deque(取決於你的用法)。

編譯器會將它放在堆棧上(可能導致堆棧溢出),還是它足夠智能將它放在堆上?

堆棧溢出是理論堆棧和理論堆碰撞和混合的時候。 如果堆棧過度使用,那么堆也將失敗。

某些系統具有最大堆棧大小(這是編譯器和平台特定的),請參閱編譯器文檔以獲取詳細信息。 因此,通常最好動態分配大型結構(盡管不是直接)。

std :: vector就是這樣(可能)。 它有一個小的本地對象存在但主要的有效負載(通常)是作為動態堆分配實現的。

根據我的經驗,最好在堆上分配這么大的數組(因此通過new) - 在堆棧上分配2 MB后,我在unix系統上看到了一個程序核心轉儲...如果你想自動刪除,你可以使用智能指針(例如,boost :: scoped_array)。 但是,既然你提到“在程序結束時自動刪除它”,你實際上不需要做任何事情 - 操作系統將在它終止時回收你所有進程的內存。

無論如何,你真的應該使用std :: vector而不是原始數組。

如果您靜態分配它,它將被靜態分配。 在典型的情況下,可執行文件中會有一些類型的記錄,指定特定變量應該是大小為N的零初始化塊。加載器通常會尊重它,就像它為程序的代碼分配空間一樣這樣的(例如,它會分配地址空間但通常不是實際的內存來支持它,直到/除非你實際讀/寫那個內存)。

到目前為止,50兆字節並不算太多。

您可以使用C ++ new運算符在程序開頭分配它,並在結束時(或在定義的程序段的開頭/結尾)使用delete []取消分配它。

如果這個數組代表某個要加載的文件,那么當文件加載到內存中時,最好分配它。 最理想的是,您只能將文件的一部分映射到內存中(例如:1MB,2MB或您想要使用的其他邏輯“單元”)(請參閱Windows中的MapViewOfFile和UNIX系統中的mmap)。 這樣,您可以加載非常大的文件而不會耗盡虛擬內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM