我们知道编译器可以重用相同的常量字符串文字来有效地节省内存.对于编译器,此优化是可选的.
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)
ss1并ss2有两个不同的地址.
这在技术上是不可能的吗?被语言禁止?或者标准库的实现开发人员不想要它?
C++标准库类大体上都实现了强值语义,这意味着每个对象拥有其所有数据,因此对象的生命周期很容易推理.虽然参考跟踪实现可能是可能的,但它会产生相当大的复杂性成本,并且不符合"不支付你不需要的东西"的C++哲学.
早就有关于非所属弦类(类似的讨论string_ref和array_ref,如果你想搜索的话),这将只是看法上存在的字符串.这会给用户带来负担,以确保底层共享数据的生命周期适合应用程序.它可能会成为未来标准的一部分,但如果您感兴趣,可以搜索现有的实现.
| 归档时间: |
|
| 查看次数: |
480 次 |
| 最近记录: |