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

标签 c++ c string memory static

据我所知,编译时类 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/

相关文章:

javascript - 如何在JS中的文本节点(document.createTextNode ('...'))中添加span元素?

c++ - weak_ptr、make_shared 和内存释放

c++ - MFC:如何设置CEdit框的焦点?

c - 表达式是什么,真还是假

java - 用不允许出现的次数替换字符串中的所有连续重复项

c - 动态和静态字符数组

c++ - 通过成员指针 : is it a hack? 访问 protected 成员

c++ - 在 C++ 中处理大型矩阵

c++ - Homebrew 中没有用于 opencv 安装的选项

c - 如何在打印 10 列和 10 行时获取所有数组编号?