Kal*_*ish 9 c++ string-literals c++14
我正在开发一个使用无序容器的(C++)库.这些需要一个哈希(通常是模板结构的特化std::hash),用于它们存储的元素类型.在我的例子中,这些元素是封装字符串文字的类,类似于本页底部conststr的示例.STL为常量char指针提供了一个特化,但是,它只计算指针,如下所述,在'Notes'部分中:
C字符串没有专门化.
std::hash<const char*>产生指针值的哈希值(内存地址),它不检查任何字符数组的内容.
虽然这很快(或者我认为),但是C++标准并不能保证在同一地址存储多个相等的字符串文字,如本问题所述.如果不是,则不符合哈希的第一个条件:
对于两个相等的参数k1和k2,
std::hash<Key>()(k1) == std::hash<Key>()(k2)
如果给出上述保证,我想使用提供的特化选择性地计算散列,否则我想使用其他算法.虽然回过头来询问那些包含我的标题或构建我的库的人来定义一个特定的宏是可行的,但是一个实现定义的更好.
在任何C++实现中是否有任何宏,但主要是g ++和clang,其定义保证在同一地址存储几个相等的字符串文字?
一个例子:
#ifdef __GXX_SAME_STRING_LITERALS_SAME_ADDRESS__
const char str1[] = "abc";
const char str2[] = "abc";
assert( str1 == str2 );
#endif
Run Code Online (Sandbox Code Playgroud)
在任何C++实现中是否有任何宏,但主要是g ++和clang,其定义保证在同一地址存储几个相等的字符串文字?
-fmerge-constants选项(这不是保证):尝试跨编译单元合并相同的常量(字符串常量和浮点常量).
如果汇编器和链接器支持,则此选项是优化编译的缺省选项.使用-fno-merge-constants可以禁止此行为.
在-O,-O2,-O3,-Os等级启用.
字符串池允许多个缓冲区的多个指针作为指向单个缓冲区的多个指针.在以下代码中,s和t使用相同的字符串进行初始化.字符串池使它们指向相同的内存:
char *s = "This is a character buffer";
char *t = "This is a character buffer";
Run Code Online (Sandbox Code Playgroud)
注意:虽然MSDN使用char*字符串文字,但const char*应使用
-fmerge-constants选择权,但除了--help章节之外,我找不到太多关于它的内容,所以我不确定它是否真的相当于gcc的一个:禁止合并常量
无论如何,如何存储字符串文字是依赖于实现的(许多将它们存储在程序的只读部分中).
我可以建议使用而不是C风格的字符串,而不是在可能的依赖于实现的黑客上构建你的库std::string:它们的行为与你期望的完全一样.
您可以std::string使用以下emplace()方法在容器中构建就地:
std::unordered_set<std::string> my_set;
my_set.emplace("Hello");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1284 次 |
| 最近记录: |