【问题标题】:C++ STL: will c_str() be changed when creating const copy of std::string?C ++ STL:创建std :: string的const副本时会更改c_str()吗?
【发布时间】:2012-12-10 17:17:53
【问题描述】:

这是关于 STL 实现在处理 std::string 的 const 副本方面的区别的问题。我有这么短的测试,它执行 2 个 const 副本并打印 c_str() 返回的地址:

#include <stdio.h>
#include <string>
using namespace std;
int main()
{
          string a("Hello World!");
    const string b(a);
    const string c(b);

    printf("a: %p = %s\n", a.c_str(), a.c_str());
    printf("b: %p = %s\n", b.c_str(), b.c_str());
    printf("c: %p = %s\n", c.c_str(), c.c_str());
  return c.c_str() == b.c_str();
}

在我的带有 libstdc++.so.6.0.16 STL 的 gcc 4.6.2 上,所有指针都以相等的形式返回。

我可以依赖这种行为吗?

它是可移植的还是在最近的标准中定义的?

这是否适用于当前或未来版本的 libstdc++、libc++、Microsoft STL、stdcxx (apache.org)?

【问题讨论】:

  • 我认为这是一个你不应该依赖的实现细节。
  • 这是一个实现细节。语言规范中没有任何内容表明您可以依赖它。你只需要在一些不同的编译器上尝试一下就可以看到。例如尝试 VS。
  • 请注意,C++11 中禁止使用 COW,因为 n2668:open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2668.htm
  • 它在当前和未来版本的 libc++ 中都不起作用。

标签: c++ stl libstdc++ libc++ c-str


【解决方案1】:

这就是所谓的COW (Copy on Write) 语义。这是一种避免不必要的字符串复制的优化策略。但是你不能依赖这种行为——它是 GNU libstdc++ 的一个实现细节。其实不是allowed by the C++11 standard

【讨论】:

    【解决方案2】:

    您根本不能依赖这种行为。关于c_str(),唯一可以保证的是返回的指针在底层string 发生突变之前是有效的(特定方法/功能使返回的指针无效)。您不能保证它可以在任何特定架构或编译器上运行,并且不应依赖此类行为。

    【讨论】:

      猜你喜欢
      • 2021-06-30
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多