【问题标题】:Strings in static memory instances count静态内存实例中的字符串计数
【发布时间】:2013-07-28 09:07:15
【问题描述】:

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

【问题讨论】:

    标签: c++ c string memory static


    【解决方案1】:

    不,这并不总是正确的,也不是可移植的。

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

    而且它不仅仅是一个“开”或“关”的功能。不同的编译器和不同的优化设置也会影响积极的执行方式。例如,有时字符串文字仅在单个函数的范围内进行池化,有时它发生在翻译单元级别,还有一些时候链接器可能会参与跨多个翻译单元的操作。

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

    【讨论】:

      【解决方案2】:

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

      C11 §6.4.5/7 字符串字面量

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

      C++11 §2.14.5/12 字符串字面量

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

      【讨论】:

        【解决方案3】:

        但我想知道它总是正确的

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

        【讨论】:

          【解决方案4】:

          您正在比较两个不同的字符串文字,这恰好发生在 具有相同的价值。根据 C++ 标准,它是 实现定义了相同的字符串文字是否占据 相同的内存与否(这意味着实现必须 记录它的作用);根据 C 标准,它是 未指定。 (我认为 C++ 标准将允许 实现按照“字符串”的方式记录某些内容 相同内容的文字共享相同的实例,如果它们 在同一个翻译单元中,并且不共享相同的 否则实例。)

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

          char const*
          value()
          {
              return "Hello";
          }
          
          bool
          isHello( char const* str )
          {
              return str == valule;
          }
          

          然后确保字符串的所有实例都是通过 打电话给value()

          【讨论】:

            猜你喜欢
            • 2022-06-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-15
            • 1970-01-01
            • 2022-07-28
            • 2011-05-02
            相关资源
            最近更新 更多