1

我使用字符串对象作为参数编写了一个函数:

void func(string str)

当我在Linux中使用GDB调试它时,我发现它str的值_M_p与对应的参数passed( test_string)的值相同。

这是否意味着strtest_string共享相同的字符串数据?
这是什么原因?
它与复制构造函数的位复制过程有关吗?

4

3 回答 3

4

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
于 2013-01-01T09:55:15.597 回答
1

GCC 有——我不确定它是否仍然如此,但向后兼容性会要求它——一个 std::string 的写时复制 (COW) 实现。这意味着仅在必要时才会复制动态分配的资源。

它与复制构造函数的默认实现无关,std::string 的 COW 实现需要一个复制构造函数来执行某些操作(请注意,表示是共享的,因此如果发生修改则需要复制)。

于 2013-01-01T09:54:40.673 回答
1

库编写者可以std::string使用某种形式的时复制优化来实现:当您复制一个字符串(如您的示例中发生的那样)时,两个副本共享字符串数据。只有当两个字符串之一被实际修改时,才会发生数据的实际副本(可能很昂贵)。

这通常比每次制作副本时复制整个数据更有效。(但必须特别注意线程安全。)

你会发现这篇文章很有趣:C++ String Performance,它提到了这种类型的实现。

于 2013-01-01T09:55:01.003 回答