2

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

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

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有两个不同的地址。

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

4

2 回答 2

5

C++ 标准库类大体上都实现了强值语义,这意味着每个对象都拥有它的所有数据,因此对象的生命周期很容易推理。虽然引用跟踪实现可能是可能的,但它会带来相当大的复杂性成本,这不符合 C++ 的“不为你没有要求的东西付费”的理念。

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

于 2013-05-06T17:15:08.653 回答
0

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

std::string对象负责它们的字符数组。这意味着数组在std::string析构函数中被删除——并且这样的数组应该只被删除一次。

在 C char 数组中声明为

const char* bla = "blabla";

被——或者永远不应该——被释放。

于 2014-07-31T08:06:48.357 回答