C 中有许多语句什么都不做。这意味着删除它们不会对程序行为产生任何可观察到的变化。
根据C标准,C编译器是否允许优化掉这些冗余语句?
例如,如果我们有这样的代码:
#include <stdio.h>
void f(void);
int main(void){
printf("a");
f(); // function call statement that provably does nothing
printf("b");
1000; // redundant expression statement
printf("c");
; // null statement
printf("d");
int x = 1; // assignment statement that is not used
printf("e");
return 0;
}
void f(void){
1000; // redundant expression statement
; // null statement
int x = 1; // assignment statement that is not used
}
是否允许编译器生成与下面相同的目标代码? :
#include <stdio.h>
void f(void);
int main(void){
printf("a");
printf("b");
printf("c");
printf("d");
printf("e");
return 0;
}
void f(void){
}
最佳答案
早在 80 年代,我的一个 friend 告诉我他写了一个程序来执行算法来计算 pi,然后将它打印出来。
当他查看编译后的exe文件时,惊奇地发现编译器基本上已经产生了:输出3.14159
简而言之,C(或任何其他语言)编译器可以做任何不改变程序行为的事情。
这也适用于 Java 等,其中 JVM 使用多种技术来提高速度(例如,“展开”循环以便代码按顺序执行而无需经过循环开销等)
关于c - 是否允许 C 编译器优化冗余语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19510271/