gpt4 book ai didi

c++ - 检查相同的字符串文字是否存储在相同的地址

转载 作者:可可西里 更新时间:2023-11-01 16:38:10 26 4
gpt4 key购买 nike

我正在开发一个使用无序容器的 (C++) 库。这些需要一个散列器(通常是模板结构的特化 std::hash )用于它们存储的元素的类型。在我的例子中,这些元素是封装字符串文字的类,类似于 conststr the bottom of this page 处的示例. STL 为常量 char 指针提供了专门化,但是,它只计算指针,如解释的那样 here, in the 'Notes' section :

There is no specialization for C strings. std::hash<const char*> produces a hash of the value of the pointer (the memory address), it does not examine the contents of any character array.

虽然这非常快(或者我认为如此),但 C++ 标准不能保证多个相等的字符串文字是否存储在同一地址,如 this question 中所述。 .如果不是,则不会满足散列器的第一个条件:

For two parameters k1 and k2 that are equal, std::hash<Key>()(k1) ==
std::hash<Key>()(k2)

如果提供上述保证,我想使用提供的特化有选择地计算散列,否则使用其他算法。尽管重新询问那些包含我的 header 或构建我的库的人来定义特定的宏是可行的,但更可取的是实现定义的宏。

在任何 C++ 实现中是否有任何宏,但主要是 g++ 和 clang,其定义保证多个相等的字符串文字存储在同一地址?

一个例子:

#ifdef __GXX_SAME_STRING_LITERALS_SAME_ADDRESS__
const char str1[] = "abc";
const char str2[] = "abc";
assert( str1 == str2 );
#endif

最佳答案

Is there any macro, in any C++ implementation, but mainly g++ and clang, whose definition guarantees that several equal string literals are stored at the same address?

Attempt to merge identical constants (string constants and floating-point constants) across compilation units.

This option is the default for optimized compilation if the assembler and linker support it. Use -fno-merge-constants to inhibit this behavior.

Enabled at levels -O, -O2, -O3, -Os.

  • Visual StudioString Pooling (/GF 选项:“消除重复字符串”)

String pooling allows what were intended as multiple pointers to multiple buffers to be multiple pointers to a single buffer. In the following code, s and t are initialized with the same string. String pooling causes them to point to the same memory:

char *s = "This is a character buffer";
char *t = "This is a character buffer";

注意:虽然 MSDN 使用 char* 字符串字面量,但应该使用 const char*

  • clang 显然也有 -fmerge-constants 选项,但我找不到太多关于它的信息,除了在 --help 部分,所以我不确定它是否真的等同于 gcc 的部分:

Disallow merging of constants


无论如何,字符串文字的存储方式取决于实现(许多确实将它们存储在程序的只读部分)。

不是在可能的依赖于实现的 hack 上构建你的,我只能建议使用 std::string 而不是 C 风格的字符串:它们将表现完全符合您的预期。

您可以使用 emplace() 方法在您的容器中就地构造您的 std::string :

    std::unordered_set<std::string> my_set;
my_set.emplace("Hello");

关于c++ - 检查相同的字符串文字是否存储在相同的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25576363/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com