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

tri*_*san 14 c c++ memory string static

据我所知,编译时类C字符串只作为一个实例保存在静态内存中.例如,我true在下面的gcc 4.6运行示例中得到了两个.但我想知道它总是真的可以携带.C和C++上的行为很有趣.

#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';
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*ray 12

不,这并非总是如此,也不是便携式的.

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

而且它不仅仅是一个"开"或"关"功能.不同的编译器和不同的优化设置也会影响执行的积极程度.例如,有时字符串文字仅在单个函数的范围内汇集,有时它发生在转换单元的级别,有时链接器可能涉及跨多个转换单元执行它.

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


Yu *_*Hao 9

不,它的实现依赖于C和C++.

C11§6.4.5/ 7 字符串文字

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

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

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