据我所知,编译时类 C 字符串仅作为一个实例保存在静态内存中。例如,我在下面的 gcc 4.6 运行示例中得到了两个 true
。但我想知道它是否总是真实的并且可以携带。 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';
}
最佳答案
不,这并不总是正确的,也不是可移植的。
合并相同的字符串文字是由编译器和链接器共同执行的优化。 GCC 和 Microsoft 的编译器的最新版本都支持它,但仅在设置了某些优化开关时才支持。
而且它不仅仅是一个“开”或“关”的功能。不同的编译器和不同的优化设置也会影响积极的执行方式。例如,有时字符串文字仅在单个函数的范围内进行池化,有时它发生在翻译单元的级别,还有一些时候链接器可能会参与跨多个翻译单元的操作。
这是允许的,因为 C 和 C++ 标准将此行为视为依赖于实现。
关于c++ - 静态内存实例中的字符串计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17909417/