C ++ STL:在创建std :: string的const副本时会改变c_str()吗?

时间:2012-12-10 17:17:54

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

这是关于处理std::string的const副本的STL实现之间的区别的问题。我有这么短的测试,它执行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();
}

在我的gcc 4.6.2上使用libstdc ++。so.6.0.16 STL所有指针都返回相等。

我可以依赖这种行为吗?

是否可移植或在最近的标准中定义?

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

2 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:3)

你根本不能依赖这种行为。与c_str()相关的唯一保证是返回的指针有效,直到基础string发生变异(特定方法/特征使返回的指针无效)。您无法保证它可以在任何特定的体系结构或编译器上运行,也不应该依赖于这种行为。