GCC 如何优化此代码?
How is this code optimized by GCC?
#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
(本质上是它在您的情况下所做的事情)并生成适合于此的代码。
当然,从实现质量的角度来看,一个好的编译器应该告诉你这是非法的,并且不会做任何积极有害的事情(比如重新格式化你的驱动器),但一切皆有可能。
#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
(本质上是它在您的情况下所做的事情)并生成适合于此的代码。
当然,从实现质量的角度来看,一个好的编译器应该告诉你这是非法的,并且不会做任何积极有害的事情(比如重新格式化你的驱动器),但一切皆有可能。