我的程序中有几个相同的字符串常量:
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?
;
}
答案 0 :(得分:11)
当然不能保证,但这是一种常见的(我认为)优化。
C ++标准说(2.13.4 / 2“字符串文字):
是否所有字符串文字都是不同的(即存储在非重叠对象中)是实现定义的。
要明确的是,你不应该编写假设将进行优化的代码 - 正如Chris Lutz所说,依赖于此的C ++代码是等待被破坏的代码。
答案 1 :(得分:8)
在你的情况下,最好不要依赖它。范围不同,但我发现自己在这个问题上并不是很有能力
答案 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
来比较内存地址:)
有些外星人可能会失踪......我对那只野兽有些困难