首页 > 解决方案 > 相同内容字符串文字的存储是否保证相同?

问题描述

下面的代码安全吗?编写类似这样的代码可能很诱人:

#include <map>

const std::map<const char*, int> m = {
    {"text1", 1},
    {"text2", 2}
};

int main () {
    volatile const auto a = m.at("text1");
    return 0;
}

该映射旨在仅与字符串文字一起使用。

我认为这是完全合法的并且似乎正在工作,但是我从来没有看到保证在两个不同地方使用的文字指针是相同的。我无法让编译器为具有相同内容的文字生成两个单独的指针,所以我开始怀疑这个假设有多可靠。

我只对具有相同内容的文字是否可以有不同的指针感兴趣。或者更正式地说,上面的代码可以除外吗?

我知道有一种方法可以编写代码来确保它有效,我认为上述方法很危险,因为编译器可能会决定为文字分配两个不同的存储空间,特别是如果它们被放置在不同的翻译单元中。我对吗?

标签: c++storagelanguage-lawyerstring-literals

解决方案


具有完全相同内容的两个字符串文字是否是完全相同的对象,未指定,在我看来最好不要依赖。引用标准:

[lex.string]

16评估字符串文字会产生一个具有静态存储持续时间的字符串文字对象,从上面指定的给定字符初始化。是否所有字符串文字都是不同的(即,存储在不重叠的对象中)以及字符串文字的连续评估是否产生相同或不同的对象是未指定的。

如果您希望避免 的开销std::string,您可以编写一个简单的视图类型(或std::string_view在 C++17 中使用),它是字符串文字的引用类型。使用它来进行智能比较,而不是依赖文字身份。


推荐阅读