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

发布于 2024-12-20 19:47:54 字数 289 浏览 0 评论 0原文

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

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

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

I've seen various conflicting references to the copy constructor behaviour of STL strings in C++ and I was hoping someone could clarify this for me, given the following code segment:

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

Does the object 's' constitute a deep copy of the string object defined in the function 'str()'? or is the object 's' simply pointing at the same chunk of memory allocated during the string constructor call in the 'str()' function?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

携余温的黄昏 2024-12-27 19:47:54

String将进行深复制,它们不共享相同的缓冲区。

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

如果您使用的是 c++11,那么移动语义是由标准指定的,因此对于返回字符串之类的事情请放心,最坏的情况(即使没有优化)是相当便宜的。

编辑:总而言之,您可以保证您“拥有”的字符串将拥有一个独特的内存块,该内存块至少会在本地字符串的生命周期内持续存在。然而,编译器很可能不会从函数中的字符串中复制它,而只是交换它的指针,甚至完全删除副本(意味着函数中的字符串实际上也是您分配的字符串)。

String will deep copy, they do not shared the same buffer.

That said when returning them from a function most good compilers can either use Return Value Optimisation or Copy elision so that manoeuvre isn't all that expensive (or even free).

If you are using c++11 then move semantics are specified by the standard so for thing like return string rest assured that the worst case (even without optimisations) is fairly cheap.

EDIT: to summarise, you are guaranteed that the string you "own" will have a unique chunk of memory which will persist for at least the life time of the local string. However it is more than likely that the compiler won't copy it from the string in the function but rather just swap it's pointers or even elided the copy altogether (meaning the string in the function would actually be the string you assign too).

静若繁花 2024-12-27 19:47:54

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

来自 N3126,21.4.2,表 61:

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

Yes, it performs a logical deep copy.

From N3126, 21.4.2, Table 61:

data() - points at the first element of an allocated copy
of the array whose first element is pointed at by
str.data()

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文