【问题标题】:Constant strings address常量字符串地址
【发布时间】:2009-10-23 06:25:57
【问题描述】:

我的程序中有几个相同的字符串常量:

const char* Ok()
{
  return "Ok";  
}

int main()
{
  const char* ok = "Ok";
}

是否保证它们具有相同的地址,即我可以编写以下代码吗?我听说 GNU C++ 优化字符串使它们具有相同的地址,我可以在我的程序中使用该功能吗?

int main()
{
  const char* ok = "Ok";
  if ( ok == Ok() ) // is it ok?
  ;
}

【问题讨论】:

  • 除非绝对必须,否则不要依赖特定于编译器的功能。如果您想要“==”以获得更好的可读性 - 选择具有运算符重载的轻量级。
  • 我建议为字符串“命名”,然后仅通过该名称引用它...请参阅下面的回复。

标签: c++ constants string-comparison


【解决方案1】:

当然不能保证,但这是一种常见的(我认为)优化。

C++ 标准说(2.13.4/2“字符串文字):

是否所有字符串文字都是不同的(即存储在不重叠的对象中)是实现定义的。

需要明确的是,您不应该编写假设这种优化会发生的代码 - 正如 Chris Lutz 所说,依赖于此的 C++ 代码是等待被破坏的代码。

【讨论】:

    【解决方案2】:

    这叫string interning

    在您的情况下,最好不要依赖它。范围不同,但我发现自己在这个主题上不是很胜任

    【讨论】:

    • “范围”的概念在这里完全不相关。 “范围”适用于实体名称。字符串文字没有名称,因此“范围”的概念不适用于它们。
    【解决方案3】:

    GCC 使用了这种优化,微软也使用了(他们称之为string pooling)。这只是优化,C++ 标准明确声明您不能使用它(在 2.13.4/2 中)。此外,想象一下你会从其他模块/库中获得指向字符串的指针——我认为编译器在这种情况下无法进行这样的优化。

    【讨论】:

      【解决方案4】:

      是否保证它们具有相同的地址,即我可以编写以下代码吗?

      该标准允许此类优化,因为字符串文字是只读的。

      我听说 GNU C++ 优化了字符串,使它们具有相同的地址,我可以在我的程序中使用该功能吗?

      是的,GCC/G++ 经常这样做。 AFAIK,有一个选项可以打开/关闭它。

      【讨论】:

        【解决方案5】:

        没有这样的保证。语言只是说他们可能有相同的地址。或者他们可能不会。

        【讨论】:

          【解决方案6】:

          其实是有解决办法的,这么简单的解决办法:

          char const * const Message_Ok = "OK";
          
          char const * const OK() { return Message_Ok; }
          
          int main(int argc, const char* argv[])
          {
            if (OK() == Message_Ok) { std::cout << "OK" << std::endl; }
            return 0;
          }
          

          你不能比较两个不同的字符串文字,但使用一个 const 全局变量来传达你的意思,它是 OK 来比较内存地址:)

          可能缺少一些外部人员......我对那个野兽有些困难

          【讨论】:

          • 或者 OP 只能使用 OK 函数而不复制文字:int main(){ const char* ok = OK(); if ( ok == Ok() ) ; }
          • 是的,总而言之,我们只是在谈论 DRY 原则的变体 :)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-17
          • 1970-01-01
          • 1970-01-01
          • 2021-03-01
          • 1970-01-01
          • 2020-10-08
          相关资源
          最近更新 更多