簡體   English   中英

C ++ STL字符串復制構造函數 - 始終是深層復制?

[英]C++ STL String Copy Constructor - Always a Deep Copy?

我已經看到了對C ++中STL字符串的復制構造函數行為的各種沖突引用,我希望有人可以為我澄清這一點,給出以下代碼段:

string str() { return string("this is a string"); }
//meanwhile, in some other function...
string s = str();

對象''是否構成函數'str()'中定義的字符串對象的深層副本? 或者是對象''簡單地指向在'str()'函數中的字符串構造函數調用期間分配的同一塊內存?

字符串將深層復制,它們不共享相同的緩沖區。

也就是說當從函數返回它們時,大多數優秀的編譯器可以使用返回值優化或復制省略,這樣操作就不那么昂貴(甚至免費)。

如果你使用的是c ++ 11,那么移動語義是由標准指定的,所以對於像返回字符串這樣的東西,請確保最壞的情況(即使沒有優化)相當便宜。

編輯:總結一下,您可以保證您“擁有”的字符串將具有唯一的內存塊,該內存塊將至少持續至少本地字符串的生命周期。 但是,編譯器很可能不會從函數中的字符串中復制它,而只是交換它的指針,甚至完全省略了副本(意味着函數中的字符串實際上也是你指定的字符串)。

是的,它執行邏輯深層復制。

N3126,21.4.2 ,表61:

data() - 指向數組的已分配副本的第一個元素,其第一個元素由str.data()指向

暫無
暫無

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

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