簡體   English   中英

字符串數組的內存分配

[英]memory allocation for array of strings

據我所知,數組是靜態分配的,但是字符串是動態的,因為它們的長度在運行時經常變化。

當我定義這樣的數組時會發生什么:

std::string array[] = {"abc", "defghi", "jk", "lmnop", "qrstuvwxyz"};

每個字符串分配的內存量是否有限? 還是動態分配數組?

不要想太多。 當您說T x[N]; ,則聲明一個自動(即局部作用域)數組。 這與僅聲明T x1;非常相似T x1; T x2; ,..., T xN; std::string的實例在其聲明上下文中(例如,在堆棧上)始終占據相同的小尺寸; 只是它管理的內存 (默認情況下在免費存儲中)是動態的。

請注意,當您編寫std::string s("Hello"); 在您的代碼中,然后將字符串文字(傳遞給構造函數)存儲在程序二進制文件中的某個位置,然后將其加載到程序存儲器(通常是只讀數據段)中。 因此,如果您真的只需要讀取這些字符串(而不是修改它們),則最好聲明一個char指針數組並節省一些內存:

const char * strings[] = { "Hello", "World", "!" };   // just one copy in r/o memory

文字字符串存儲在二進制文件的數據段中。

編輯:

ildjarn的評論中的要點。 std :: strings由數組中的副本構造函數創建。 它們的存儲位置取決於實現。 一些實現將小型字符串(少於32個字符)內聯存儲在數組中。 其他的將從std :: allocator分配,通常是從堆malloc分配的。

在這種情況下,編譯器會將這些文字放在ELF二進制文件的.data節中。 因此,在這種情況下,它們會在您創建的可執行文件(或庫文件)中靜態分配。

.data節通常是保留給編譯時間常數的,這些時間常數不只是硬編碼到匯編指令中。 如您所見,僅將地址保存到字符串中要比將其放置到使用它的地方便宜得多(某些整數和定義的宏可以做到)。

暫無
暫無

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

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