为什么gcc使用-O0进行了一些优化

汉特

我用gcc 4.8.4和-O0标志编译了以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>

static jmp_buf env;

static void
doJump(int nvar, int rvar, int vvar)
{
    printf("Inside doJump(): nvar=%d rvar=%d vvar=%d\n", nvar, rvar, vvar);
    longjmp(env, 1);
}

int
main(int argc, char *argv[])
{
    int nvar;
    register int rvar;          
    volatile int vvar;         

    nvar = 111;
    rvar = 222;
    vvar = 333;

    if (setjmp(env) == 0) {     
        nvar = 777;
        rvar = 888;
        vvar = 999;
        doJump(nvar, rvar, vvar);
    } else {                    
        printf("After longjmp(): nvar=%d rvar=%d vvar=%d\n", nvar, rvar, vvar);
    }

    exit(EXIT_SUCCESS);
}

它产生了以下输出:

Inside doJump(): nvar=777 rvar=888 vvar=999
After longjmp(): nvar=777 rvar=222 vvar=999

我的期望是,由于禁用了所有优化,第二行中的rvar将为888。

当我从“ rvar”的定义中删除“ register”或在“ register”前面添加“ volatile”时,输出888。

因此,尽管-O0标志似乎gcc仍然执行一些优化。

有没有办法禁用gcc中的绝对所有优化?

乔纳森·莱夫勒

C11标准表示longjmp()

到该函数被调用时,所有可访问对象都具有值,并且抽象机249的所有其他组件都具有状态longjmp,只是自动存储持续时间的对象的值在函数中是本地的,包含相应的调用setjmp不具有volatile限定类型并且在setjmp调用和longjmp调用之间已更改的宏是不确定的。

249)这包括但不限于浮点状态标志和打开文件的状态。

您正在遇到不确定的值...符合标准的行为。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在for循环中进行了一些更改后,键的值没有更改

“ constexpr if”与“ if”进行了优化-为什么需要“ constexpr”?

如何确定Swift是否使用优化进行了编译

为什么GCC会说一个未使用的变量?

gcc -O0仍然优化出“未使用”的代码。是否有一个编译标志来改变它?

为什么像 gcc 这样的一些编译器需要你激活优化?为什么不默认运行它们?

C ++中的文件范围变量在gcc和clang中进行了不同的优化

GCC为什么不将a * a * a * a * a * a优化为(a * a * a)*(a * a * a)?

为什么gcc不优化即时?

使用GCC编译时,为什么.o文件的.bss节的大小似乎为0?

ASP.NET VNext对云进行了优化是什么意思?

为什么 gcc 在优化时默认使用 size-aware delete 操作符?

为什么在启用 GCC 优化的情况下,使用 strlen 的代码要慢 6.5 倍?

同时通过gcc和clang优化(i--):为什么不使用sub / jnc?

为什么Pytest进行了固定参数的嵌套循环

Rust编译器使用“ loop”和“ while true”进行了哪些优化?

是否对不使用模板参数的模板化类的方法进行了编译器优化?

为什么以下代码使用clang而不是gcc进行编译

为什么使用GCC进行模糊的函数调用?模板推导失败?

为什么-o与gcc会更改输出

为什么仅使用-fno-signed-zeros可以进行优化,而似乎也需要-ffinite-math-only(gcc)

为什么GCC会定义一元运算符'&&'而不是仅使用'&'?

为什么尽管Debug进行了调试,但Release版本却没有构建,而仅对使用相同源文件的项目之一进行构建?

为什么GCC会在O3上删除我的代码,而不在O0上删除我的代码?

为什么只有在使用gcc编译器进行优化时,我错误地将指针返回到堆栈上的值,printf才会打印0?

Json到Pandas Dataframe进行了一些修改

棉绒错误阻止进行了一些研究,但未成功

NSNumberFormatter对一些货币的货币金额进行了四舍五入

为什么gcc -O3处理avx256的内在函数与gcc -O0和clang不同?