【问题标题】:Why string parameter shares the same address with the argument为什么字符串参数与参数共享相同的地址
【发布时间】:2012-12-16 01:45:43
【问题描述】:

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

void func(string str)

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

是否意味着strtest_string 共享相同的字符串数据?
这是什么原因?
和拷贝构造函数的位拷贝过程有关系吗?

【问题讨论】:

  • 请提供更多信息。举个例子。您是否正在使用 func 修改字符串?你使用什么编译器选项?

标签: c++ string parameters copy arguments


【解决方案1】:

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

它与复制构造函数的默认实现没有关系,std::string 的 COW 实现需要一个复制构造函数来做一些事情(注意表示是共享的,因此如果发生修改则需要复制)。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      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
      

      【讨论】:

      • 一般来说不是“C++ 字符串”,而是 GCC 的实现。
      猜你喜欢
      • 2013-09-05
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多