代码之家  ›  专栏  ›  技术社区  ›  big-z

常量字符串地址

  •  6
  • big-z  · 技术社区  · 15 年前

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

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

    是否保证他们有相同的地址,也就是说,我可以写下面的代码?我听说GNUC++优化字符串,所以它们有相同的地址,我可以在程序中使用这个特性吗?

    int main()
    {
      const char* ok = "Ok";
      if ( ok == Ok() ) // is it ok?
      ;
    }
    
    6 回复  |  直到 15 年前
        1
  •  11
  •   Michael Burr    15 年前

    当然没有保证,但这是一个常见的(我认为)优化。

    C++标准表示(2.134/2)字符串文字:

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

    要清楚,你不应该编写代码,假设这种优化将发生-正如Chris Lutz所说,C++代码依赖于这一代码是等待被打破。

        2
  •  8
  •   Svetlozar Angelov    15 年前

    这叫做 string interning

    在你的情况下,最好不要依赖它。范围是不同的,但我觉得自己在这个问题上不是很有能力

        3
  •  3
  •   Kirill V. Lyadvinsky    15 年前

    GCC使用这种优化,而微软则使用这种优化(他们称之为 string pooling )它只是优化,C++标准明确声明不能使用(2.2.4/2)。另外,假设您将从其他模块/库中获得指向字符串的指针——我认为编译器在这种情况下不可能进行这样的优化。

        4
  •  2
  •   dirkgently    15 年前

    是否保证他们有相同的地址,也就是说,我可以写下面的代码?

    由于字符串文本是只读的,因此标准允许这样的优化。

    我听说GNUC++优化字符串,所以它们有相同的地址,我可以在程序中使用这个特性吗?

    是的,gcc/g++经常这样做。Afaik,有一个打开/关闭的选项。

        5
  •  2
  •   AnT stands with Russia    15 年前

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

        6
  •  0
  •   Matthieu M.    15 年前

    实际上,有一个简单的解决方案:

    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;
    }
    

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

    一些外部的东西可能不见了…我很难对付那只野兽