簡體   English   中英

內存中分配的 std::string 在哪里?

[英]Where is a std::string allocated in memory?

這是一個函數:

void foo() {
   string str = "StackOverflo";
   str.push_back('w');
}

當我們在函數內部聲明字符串時,它是存儲在堆棧還是堆中? 為什么?

string foo() {
   string str = "StackOverflo";
   str.push_back('w');
   return str;
}

我們可以返回字符串引用並繼續在程序中的其他地方使用嗎?

當我們在函數內部聲明 String 時,它是存儲在 Stack 還是 Heap 中?

字符串對象本身存儲在堆棧中,但它指向堆上的內存。

為什么?

語言被定義為字符串對象存儲在堆棧中。 字符串構造對象的實現使用堆上的內存。

對象str (它是類std::string的實例)在堆棧中分配。 但是,字符串數據本身可以分配在堆中。 這意味着該對象有一個指向包含實際字符串的緩沖區的內部指針。 然而,如果字符串很小(如本例中),通常字符串類將具有我們所說的“小字符串優化”。 這意味着std::string對象本身的大小足以包含字符串的數據,如果它足夠小(通常大約 23 個字節 + 1 個字節用於空終止符)......然后如果內容大於這個,字符串數據將被分配在堆中。

通常你可以正常返回你的字符串。 C++ 可以為您處理這個問題。 移動語義在這里可以處理任何需要返回指向原始字符串相同字符串數據的字符串對象,避免進行不必要的復制。

"StackOverflo" ,字符串文字,可能存儲在二進制文件的只讀數據空間中,並在程序啟動時映射到內存中。 您可以在此處閱讀更多相關信息。

str ,類實例str ,在堆棧上分配。 但是它的構造函數為復制字符串文字而分配的內存是在堆上分配的。

foo函數返回str副本,因此您編碼的內容沒問題。

C++ 中的所有局部變量都存儲在堆棧中。 甚至本地指針也存儲在堆棧中。 但是在指針中分配的內存存儲在堆上。

因此,您的str存儲在 Stack 中,而其值存儲在 Heap 中。 因為std::string使用char指針來分配您的"stackoverflow"

在 Windows 平台上,在 C++ 中,使用 std::string,小於 14 個字符左右的字符串大小(稱為小字符串)幾乎沒有開銷地存儲在堆棧中,而上面的字符串大小存儲在堆中時有開銷。 通常取決於平台和編譯器,可以使用優化選項進行調整。

std::string myStr {"Hello World"}; // 存儲在程序棧中 std::string myStr {"StackOverflow 挽救了程序員的生命" }; //指針存儲在程序棧中,而字符串存儲在堆中

下面的鏈接有很好的解釋。 https://blogs.msmvps.com/gdicanio/2016/11/17/the-small-string-optimization/

當我們在函數內部聲明字符串時,它是存儲在堆棧中還是堆中? 為什么?

在堆上分配的最大可能也是唯一的原因是允許字符串對象的大小增長,例如通過調用push_back()append() 存儲在堆棧上的對象不能改變它的大小——這是由C/C++語言定義的。

暫無
暫無

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

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