2

这是关于 STL 实现在处理std::string. 我有这么短的测试,它执行 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)?

4

2 回答 2

10

这就是所谓的COW(写时复制)语义。这是一种避免不必要的字符串复制的优化策略。但是你不能依赖这种行为——它是 GNU libstdc++ 的一个实现细节。事实上,C++11 标准是不允许的

于 2012-12-10T17:19:13.130 回答
3

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

于 2012-12-10T18:25:31.987 回答