代码之家  ›  专栏  ›  技术社区  ›  Prasoon Saurav

gcc和turbo C的输出差异

  •  14
  • Prasoon Saurav  · 技术社区  · 14 年前

    为什么使用这两个编译器编译代码时产生的输出会有差异 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;
    }
    

    我明白了 "Optimized" 合同通用条款 "Change your compiler" 涡轮增压器c . 为什么?

    7 回复  |  直到 14 年前
        1
  •  33
  •   Community Neeleshkumar S    7 年前

    您的问题已经被标记为C以及C++。所以这两种语言我都会回答。

    [C]

    来自ISO C99( Section 6.4.5/6

    It is unspecified whether these arrays are distinct provided their elements have the appropriate values.

    也就是说是的 unspecified 是否 p q 是否指向相同的字符串文字。万一 gcc 他们都指向 "I am a string" (gcc优化您的代码)而 turbo c 他们不是。

    非特定行为: 未指定值的使用,或本国际标准规定的其他行为 两种或两种以上的可能性,并没有对任何一种情况下的选择提出进一步的要求


    [C++]

    从ISOC++- 98(C++) Section 2.13.4/2 )

    Whether all string literals are distinct(that is, are stored in non overlapping objects) is implementation defined.

    实施行为: 未指定的行为,其中每个实现 documents 如何做出选择


    另请参见 this 问题。

        2
  •  15
  •   Amardeep AC9MF    14 年前

    因为您的字符串文字是一个常量表达式,也就是说,您不应该通过指针来修改它,所以将它存储在内存空间中两次是没有实际意义的。作为一个较新的编译器,gcc默认情况下会合并文本,而turboc则不会。这是gcc支持新的语言标准的一个标志,该标准包含const数据的概念。

        3
  •  10
  •   Carl Smotricz    14 年前

    请把同一行的答案忘了

    “这是因为turboc太老了,他们当时做不到,因为它必须很快,但GCC是全新的和RAD的,这就是为什么它这样做的原因!”

    这两个编译器都支持将字符串常量合并为一个选项。GCC选项( -fmerge-constants )在优化级别启用,而Turbo C选项( -d )默认情况下处于禁用状态。如果您使用的是TCC IDE,请转至 Options|Compiler...|Code Generation.. “并检查” Duplicate strings merged ".

        4
  •  5
  •   Mike Seymour    14 年前

    -F能量常数

    尝试合并相同的常量(字符串常量和 编制单位。

    如果汇编程序 链接器支持它。使用 -fno合并常量以禁止此行为。

    因此输出。

        5
  •  3
  •   Mark Ransom    14 年前

    turboc是为快速编译而优化的,所以它没有任何会减慢编译速度的特性。识别重复的字符串将是一个缓慢的过程,即使只是轻微的。

        6
  •  1
  •   Brian Hooper    14 年前

    在过去的好日子里,汇编程序将所有的文本保存在一个文本池中,而修补文本池是一种公认的(如果没有得到批准的话)在整个程序中修改“常量”的技术。

    如果在这种情况下编译器允许 *p = 'H'; 这样就会导致行为上的重大差异。

        7
  •  0
  •   supercat    14 年前

    历史脚注:由于地址比浮点数字常量小,FORTRAN用来处理浮点常量就像C处理字符串一样。由于内存是宝贵的,相同的常量将被分配相同的空间。而且,参数传递总是通过引用完成的。这意味着,如果一个过程将一个数值常量传递给修改其参数的过程,则该“常量”的其他出现将改变该值。

    顺便问一下,有没有人注意到turboc2.0printf中的错误,当使用“%1.1f”这样的格式打印99.99(输出00.0)这样的数字时会失败?修正在2.01,它让我想起Windows3.1计算器错误。