我们知道编译器可以重用相同的常量字符串文字来有效地节省内存。对于编译器,此优化是可选的。
Two string literals have the same pointer value?
const char *s1 = "HELLO";
const char *s2 = "HELLO";
s1
和s2
可以拥有相同的地址。它们在许多编译器中具有相同的地址。例如,两者都指向地址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;
ss1
和ss2
有两个不同的地址。
技术上不可能吗?被语言禁止?或者标准库的实现开发人员不想要它?
答案 0 :(得分:5)
C ++标准库类大体上都实现了强值语义,这意味着每个对象拥有其所有数据,因此对象的生命周期很容易推理。虽然参考跟踪实现可能可能,但它会产生相当大的复杂性,并且不符合“不要为你没有要求的东西买单”的C ++哲学
长期以来一直在讨论非拥有类似字符串的类(类似string_ref
和array_ref
,如果你想搜索它),那只会是 views on existing strings。这会给用户带来负担,以确保底层共享数据的生命周期适合应用程序。它可能会成为未来标准的一部分,但如果您感兴趣,可以搜索现有的实现。
答案 1 :(得分:0)
此行为的一个原因可能是对象的内存管理:
std::string
个对象负责其角色数组。这意味着在std::string
析构函数中删除了数组 - 这样的数组只能删除一次。
在C char数组中声明为
const char* bla = "blabla";
是 - 或者永远不应该 - 被释放。