我使用字符串对象作为参数编写了一个函数:
void func(string str)
当我在Linux中使用GDB调试它时,我发现它str
的值_M_p
与对应的参数passed( test_string
)的值相同。
这是否意味着str
并test_string
共享相同的字符串数据?
这是什么原因?
它与复制构造函数的位复制过程有关吗?
我使用字符串对象作为参数编写了一个函数:
void func(string str)
当我在Linux中使用GDB调试它时,我发现它str
的值_M_p
与对应的参数passed( test_string
)的值相同。
这是否意味着str
并test_string
共享相同的字符串数据?
这是什么原因?
它与复制构造函数的位复制过程有关吗?
GCC 的 C++ 字符串实现使用写时复制策略来解决性能问题。见http://en.wikipedia.org/wiki/Copy-on-write
std::string x("Hello");
std::string y = x; // x and y use the same buffer
y += ", World!"; // now y uses a different buffer
// x still uses the same old buffer
GCC 有——我不确定它是否仍然如此,但向后兼容性会要求它——一个 std::string 的写时复制 (COW) 实现。这意味着仅在必要时才会复制动态分配的资源。
它与复制构造函数的默认实现无关,std::string 的 COW 实现需要一个复制构造函数来执行某些操作(请注意,表示是共享的,因此如果发生修改则需要复制)。
库编写者可以std::string
使用某种形式的写时复制优化来实现:当您复制一个字符串(如您的示例中发生的那样)时,两个副本共享字符串数据。只有当两个字符串之一被实际修改时,才会发生数据的实际副本(可能很昂贵)。
这通常比每次制作副本时复制整个数据更有效。(但必须特别注意线程安全。)
你会发现这篇文章很有趣:C++ String Performance,它提到了这种类型的实现。