gcc O2优化选项对内嵌汇编以及函数递归调用的影响

学习和使用c这些年来,很多方面都未深入研究过,就如脱离了IDE后,我可能连编译一个c文件的命令都写不出来。

最近需要在c中内嵌汇编解决问题,参考网上相关的资料写了一段汇编代码,在测试的时候时好时坏,找了半天也没查到原因。

后来看到一篇提到 O2 编译选项,会自动优化指令,可能会修改内嵌的汇编指令。

我试了一下,把 O2 选项去掉后,重新编译。

测试了很多次,之前出现的问题不再重现了。

难道真的是因为加了 O2 选项的原因吗? 我不能肯定,目前我只能去掉这个 O2 选项。(有人和我一样遇到同样的问题了?  http://www.cplusplus.com/forum/general/20427/)

------------------------------------------------------------------------------------------------------------------

当我去掉了 O2 选项后,我在测试时发现一个新的问题,有时程序会崩溃,错误提示:  异常代码: c00000fd

我分析了一下原因,原来是因为递归调用函数引起的。

奇怪,之前没去掉 O2 编译选项时,一直不会有这个问题。

我写了一个简单的递归调用函数,在开启 O2 选项时,递归调用不会有任何问题,但如果关闭 O2 选项后,基本上递归调用 65000 次后,就崩溃了,栈溢出了。

void digui(int *x, int y, int z)
{
    if (*x % 100 == 0)
    {
        printf("x:%d
", *x);
    }

    (*x)++;

    digui(x, y, z);
}


int main(int argc, char *argv[])
{
    int iCount = 1;

    digui(&iCount, 2, 3);

    system("pause");
    
    return 0;
}

看来, O2 编译选项对递归调用优化的很智能化。

原文地址:https://www.cnblogs.com/personnel/p/11443286.html