c - 是否允许 C 编译器优化冗余语句?

标签 c compiler-optimization

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/

相关文章:

c++ - 小字符串优化(调试与 Release模式)

C++:可以将 "try { foo(); } catch (...) { throw; }"优化为 "foo();"吗?

c++ - 在其他计算机上导入 RSA key 时出现问题

c - 评估和打印阶乘

c - realloc 损坏源内存

c++ - 使用 `size_t` 长度会影响编译器优化吗?

在链接之前编译会阻止优化

Python列表实现

c - gcc 简单算术循环性能

VB.NET 选择案例编译器优化?