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

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

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

===============>>#1 票数:5 已采纳

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

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

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

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

===============>>#2 票数:1

是的,它执行逻辑深层复制。

N3126,21.4.2 ,表61:

data() - 指向数组的已分配副本的第一个元素,其第一个元素由str.data()指向

  ask by Gearoid Murphy translate from so

未解决问题?本站智能推荐: