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

mas*_*oud 2 c++

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

两个字符串文字具有相同的指针值?

const char *s1 = "HELLO";
const char *s2 = "HELLO";
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

ss1ss2有两个不同的地址.

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

Ker*_* SB 5

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

早就有关于非所属弦类(类似的讨论string_refarray_ref,如果你想搜索的话),这将只是看法上存在的字符串.这会给用户带来负担,以确保底层共享数据的生命周期适合应用程序.它可能会成为未来标准的一部分,但如果您感兴趣,可以搜索现有的实现.