【问题标题】:How is this code optimized by GCC?GCC如何优化这段代码?
【发布时间】:2016-01-01 09:39:45
【问题描述】:
#include <stdio.h>

int main() {
    const int a = 10;
    int *ptr = &a;

    printf("Initial value of a:%d\n", a);

    *ptr = 100;
    printf("Modified value of a: %d\n", a);

    return 0;  
}

输出(gcc -O3 const_ptr.c -o const_ptr -save-temps):

 Initial value of a: 10
 Modified value of a: 100

我在启用优化的情况下编译了代码,但直到a 的值在第二个printf 之前被修改,代码是否适合代码优化?

【问题讨论】:

  • 你有什么问题
  • 未定义的行为。您正在修改 const 对象。
  • 为什么你认为优化设置应该改变代码行为?

标签: c optimization undefined-behavior


【解决方案1】:

是的,因为代码涉及未定义的行为,所以从优化的角度来看,编译器所做的任何事情都是正确的。它可以决定生成什么都不做、什么都不输出的代码,或者它可以决定忽略const(在您的情况下基本上是它正在做的事情)并生成适合于此的代码。

当然,从实施质量问题来看,GOOD 编译器应该告诉您这是非法的,并且不会做任何有害的事情(例如重新格式化驱动器),但一切皆有可能。

【讨论】:

  • 当我们应用代码优化时,编译器允许更改常量值吗?
  • const int 的地址分配给int* 而不进行强制转换是违反约束的,因此编译器必须发出诊断。如果发生约束冲突,符合标准的实现可以做任何事情——甚至运行一个完全不同的程序。这种可能性不仅仅是假设的。如果例如由于违反约束,构建工具放弃生成新的a.out,但旧的a.out 是从其他程序遗留下来的,尝试运行应该是新建程序的程序可能会运行旧程序.
猜你喜欢
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多