C++;STL字符串复制构造函数-始终是深度复制? 我看到了C++中STL字符串复制构造函数行为的各种冲突引用,我希望有人能为我澄清这一点,给出以下代码段: string str() { return string("this is a string"); } //meanwhile, in some other function... string s = str();

C++;STL字符串复制构造函数-始终是深度复制? 我看到了C++中STL字符串复制构造函数行为的各种冲突引用,我希望有人能为我澄清这一点,给出以下代码段: string str() { return string("this is a string"); } //meanwhile, in some other function... string s = str();,c++,string,memory,copy-constructor,C++,String,Memory,Copy Constructor,对象“的”是否构成函数“str()”中定义的字符串对象的深度副本?或者对象的“s”只是指向在“str()”函数中的字符串构造函数调用期间分配的相同内存块?字符串将进行深度复制,它们不共享相同的缓冲区 也就是说,当从函数返回它们时,大多数好的编译器可以使用返回值优化或复制省略,这样操作就不会那么昂贵(甚至是免费的) 如果您使用的是c++11,那么移动语义是由标准指定的,因此对于返回字符串之类的东西,请放心,最坏的情况(即使没有优化)是相当便宜的 编辑:概括地说,我们保证您“拥有”的字符串将具有唯一

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

字符串将进行深度复制,它们不共享相同的缓冲区

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

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


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

是的,它执行逻辑深度复制

根据第21.4.2节表61:

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


确切的复制语义是什么并不重要,因为在上面的示例中,任何健全的编译器都会优化所有副本。如果出于某种原因,这是不可能的,那么移动语义是必需的。Wikipedia:),我应该知道,我怎么知道这个机制是否正在g++中使用?如果不看ASM,我认为你不可能。但正如我所说的,移动语义是标准的一部分,移动构造函数/分配运算符将/应该为std lib定义,如果您使用c++11,将使用这些运算符,这可以保证每个字符串拥有唯一的缓冲区吗?是否不允许写时复制实现?标准中没有详细说明COW,但是您的实现是否使用COW尚不清楚。例如,clang确实有一些容器和字符串的COW,我不知道这是否会干扰复制省略。也许说每个字符串都有一个唯一的缓冲区是有点明确的,但是我认为这样做是安全的。@ 111111牛是在1997 C++标准中明确设计的;代码>标准::字符串因此具有有趣的(=中断的)无效语义。“真实”STL容器不允许使用COW。牛串是一个坏主意,因为每个人都意识到太晚了。你能发布一个链接到你所指的标准吗?谢谢。