C++ STL字符串复制构造函数 - 始终是深层复制?

Gea*_*phy 11 c++ memory string copy-constructor

我已经看到了对C++中STL字符串的复制构造函数行为的各种冲突引用,我希望有人可以为我澄清这一点,给出以下代码段:

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

对象''是否构成函数'str()'中定义的字符串对象的深层副本?或者是对象''简单地指向在'str()'函数中的字符串构造函数调用期间分配的同一块内存?

111*_*111 6

字符串将深层复制,它们不共享相同的缓冲区.

也就是说当从函数返回它们时,大多数优秀的编译器可以使用返回值优化或复制省略,这样操作就不那么昂贵(甚至免费).

如果你使用的是c ++ 11,那么移动语义是由标准指定的,所以对于像返回字符串这样的东西,请确保最坏的情况(即使没有优化)相当便宜.

编辑:总结一下,您可以保证您"拥有"的字符串将具有唯一的内存块,该内存块将至少持续至少本地字符串的生命周期.但是,编译器很可能不会从函数中的字符串中复制它,而只是交换它的指针,甚至完全省略了副本(意味着函数中的字符串实际上也是你指定的字符串).