C++ 静态内存实例中的字符串计数

C++ 静态内存实例中的字符串计数,c++,c,string,memory,static,C++,C,String,Memory,Static,据我所知,类compiletime C字符串仅作为一个实例保存在静态内存中。例如,我在GCC4.6上运行下面的示例,得到了两个true。但我想知道它是否总是真实的,是否可以随身携带。C和C++的行为很有趣。< /P> #include <iostream> bool amIportable(const char* value) { const char* slocal = "Hello"; return (slocal==value); } int main() {

据我所知,类compiletime C字符串仅作为一个实例保存在静态内存中。例如,我在GCC4.6上运行下面的示例,得到了两个
true
。但我想知道它是否总是真实的,是否可以随身携带。C和C++的行为很有趣。< /P>
#include <iostream>

bool amIportable(const char* value) {
  const char* slocal = "Hello";
  return (slocal==value);
}

int main() {
  const char* s = "Hello";
  std::cout << std::boolalpha 
            << amIportable(s) << '\n'
            << amIportable("Hello") << '\n';
}
#包括
布尔值(常量字符*值){
const char*slocal=“你好”;
返回值(slocal==值);
}
int main(){
const char*s=“你好”;

STD::CUT< P>不,它是C和C++的依赖实现。

C11§6.4.5/7字符串文字

如果这些数组的元素具有适当的值,则未指定这些数组是否不同。如果程序试图修改此类数组,则行为未定义

C++11§2.14.5/12字符串文字

是否所有字符串文字都是不同的(即存储在非重叠对象中)由实现定义。尝试修改字符串文字的效果未定义


不,这并不总是正确的,也不是便携的

合并相同的字符串文字是由编译器和链接器共同执行的优化。GCC和Microsoft编译器的最新版本都支持该优化,但仅当设置了某些优化开关时才支持

这不仅仅是“开”或“关”功能。不同的编译器和不同的优化设置也会影响执行的力度。例如,有时字符串文字仅在单个函数的作用域内汇集,有时在翻译单元级别汇集,有时链接器可能会跨多个功能单元进行汇集多重翻译单位

这是允许的,因为C和C++标准将此行为作为依赖于实现。

但我想知道这是真的吗


不,至少C标准是这样说的:“两个相同的字符串文本是否存储在同一个数组中是由实现定义的”。

您正在比较两个不同的字符串文本,这两个字符串文本恰好是 具有相同的值,根据C++标准,它是 实现定义了相同的字符串文字是否占用 内存是否相同(这意味着实现必须 记录它的功能);根据C标准,它是 (我假定C++标准允许 按照“字符串”行记录某些内容的实现 相同内容的文本共享同一实例,如果 在同一翻译单元中,且不共享相同的 否则,请举例说明。)

如果你的目标是能够比较指针,通常 解决方案是使用函数(如果是类成员,则为静态函数) 返回字符串文字:

char const*
value()
{
    return "Hello";
}

bool
isHello( char const* str )
{
    return str == valule;
}
然后确保字符串的所有实例都是通过 调用
value()