6

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

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

6 回答 6

11

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

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

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

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

于 2009-10-23T06:30:25.350 回答
8

这称为字符串实习

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

于 2009-10-23T06:30:26.877 回答
3

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

于 2009-10-23T06:47:14.957 回答
2

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

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

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

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

于 2009-10-23T06:31:10.310 回答
2

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

于 2009-10-23T06:36:29.830 回答
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比较内存地址:)

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

于 2009-10-23T12:42:09.737 回答