Pra*_*rav 14 c c++ compiler-construction string optimization
为什么会出现在当代码使用两个编译器编译产生的输出的差值gcc和turbo c.
#include <stdio.h>
int main()
{
char *p = "I am a string";
char *q = "I am a string";
if(p==q)
{
printf("Optimized");
}
else{
printf("Change your compiler");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到"Optimized"的gcc和"Change your compiler"上turbo c.为什么?
Pra*_*rav 33
您的问题已被标记为C以及C++.所以我会回答这两种语言.
[C]
来自ISO C99(Section 6.4.5/6)
It is unspeci?ed whether these arrays are distinct provided their elements have the appropriate values.
这意味着它unspecified是否p和q都指向相同的字符串字面与否.如果gcc他们两个都指向"I am a string"(gcc优化你的代码),而turbo c他们不是.
未指定的行为:使用未指定的值或本国际标准提供两种或更多种可能性的其他行为,并且在任何情况下都不会对其进行任何进一步的要求
[C++]
来自ISO C++ - 98(Section 2.13.4/2)
Whether all string literals are distinct(that is, are stored in non overlapping objects) is implementation defined.
在C++中,您的代码调用实现定义的行为.
实现定义的行为:Unspeci fi ed行为,其中每个实现documents如何做出选择
另见这个问题.
Ama*_*9MF 15
由于您的字符串文字是一个常量表达式,即您不应该通过指针修改它,因此将它存储在内存空间中两次没有任何实际意义.作为一个较新的编译器,gcc默认合并文字而Turbo C不合并.这是gcc支持具有const数据概念的新语言标准的一个标志.
Nor*_*ame 10
请忘记与答案相同的答案
"这是因为Turbo C完全是旧的,他们不能这样做,因为它必须是快速的,但GCC完全是新的和RAD,这就是为什么它这样做!" .
两个编译器都支持合并字符串常量作为选项.GCC选项(-fmerge-constants)在优化级别打开,而Turbo C选项(-d)在默认情况下关闭.如果您使用的是TCC IDE,请转到Options|Compiler...|Code Generation..并选中" Duplicate strings merged".
从gcc手册页:
-fmerge常数
尝试跨编译单元合并相同的常量(字符串常量和浮点常量).
如果汇编器和链接器支持,则此选项是优化编译的缺省选项.使用-fno-merge-constants可以禁止此行为.
在-O,-O2,-O3,-Os等级启用.
因此输出.