gcc和turbo C的输出差异

Pra*_*rav 14 c c++ compiler-construction string optimization

为什么会出现在当代码使用两个编译器编译产生的输出的差值gccturbo 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是否pq都指向相同的字符串字面与否.如果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如何做出选择


另见这个问题.

  • +1报告主观标准定义的"未指定"/"实现定义"行为的含义. (7认同)

Ama*_*9MF 15

由于您的字符串文字是一个常量表达式,即您不应该通过指针修改它,因此将它存储在内存空间中两次没有任何实际意义.作为一个较新的编译器,gcc默认合并文字而Turbo C不合并.这是gcc支持具有const数据概念的新语言标准的一个标志.

  • 您可以通过传递`-fno-merge-constants`选项在gcc中覆盖此行为,但通常没有充分的理由这样做. (2认同)

Nor*_*ame 10

请忘记与答案相同的答案

"这是因为Turbo C完全是旧的,他们不能这样做,因为它必须是快速的,但GCC完全是新的和RAD,这就是为什么它这样做!" .

两个编译器都支持合并字符串常量作为选项.GCC选项(-fmerge-constants)在优化级别打开,而Turbo C选项(-d)在默认情况下关闭.如果您使用的是TCC IDE,请转到Options|Compiler...|Code Generation..并选中" Duplicate strings merged".


Pra*_*n S 5

从gcc手册页:

-fmerge常数

尝试跨编译单元合并相同的常量(字符串常量和浮点常量).

如果汇编器和链接器支持,则此选项是优化编译的缺省选项.使用-fno-merge-constants可以禁止此行为.

在-O,-O2,-O3,-Os等级启用.

因此输出.