常量字符串地址

时间:2009-10-23 06:25:58

标签: c++ constants string-comparison

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

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

6 个答案:

答案 0 :(得分:11)

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

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

  

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

要明确的是,你不应该编写假设将进行优化的代码 - 正如Chris Lutz所说,依赖于此的C ++代码是等待被破坏的代码。

答案 1 :(得分:8)

这称为string interning

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

  

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

标准允许这样的优化,因为字符串文字是只读的。

  

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

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

答案 4 :(得分:2)

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

答案 5 :(得分:0)

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

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来比较内存地址:)

有些外星人可能会失踪......我对那只野兽有些困难