基于相同的const文字优化std :: string

时间:2013-05-06 17:07:33

标签: c++

我们知道编译器可以重用相同的常量字符串文字来有效地节省内存。对于编译器,此优化是可选的。

Two string literals have the same pointer value?

const char *s1 = "HELLO";
const char *s2 = "HELLO";

s1s2可以拥有相同的地址。它们在许多编译器中具有相同的地址。例如,两者都指向地址0x409044

好。

我心中的问题是,std::string为什么不尝试同样的优势?并且它不会尝试将std::string包裹在该地址周围。

const std::string ss1("HELLO");
const std::string ss2("HELLO");

cout << (void*) ss1.c_str() << endl;
cout << (void*) ss2.c_str() << endl;

ss1ss2有两个不同的地址。

技术上不可能吗?被语言禁止?或者标准库的实现开发人员不想要它?

2 个答案:

答案 0 :(得分:5)

C ++标准库类大体上都实现了强值语义,这意味着每个对象拥有其所有数据,因此对象的生命周期很容易推理。虽然参考跟踪实现可能可能,但它会产生相当大的复杂性,并且不符合“不要为你没有要求的东西买单”的C ++哲学

长期以来一直在讨论非拥有类似字符串的类(类似string_refarray_ref,如果你想搜索它),那只会是 views on existing strings。这会给用户带来负担,以确保底层共享数据的生命周期适合应用程序。它可能会成为未来标准的一部分,但如果您感兴趣,可以搜索现有的实现。

答案 1 :(得分:0)

此行为的一个原因可能是对象的内存管理:

std::string个对象负责其角色数组。这意味着在std::string析构函数中删除了数组 - 这样的数组只能删除一次。

在C char数组中声明为

const char* bla = "blabla";

是 - 或者永远不应该 - 被释放。