zoukankan      html  css  js  c++  java
  • 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 编译选项对递归调用优化的很智能化。

  • 相关阅读:
    深入解析委托和事件
    一个小型工程报价系统(三层架构)
    DONET三层架构开发初步
    VS项目重命名工具
    Visual Studio 2012 应用软件开发新方式
    Consumer is not subscribed to any topics or assigned any partitions
    kafka的一些常用命令
    横向遍历二叉树
    Flume的断点续传解决
    实际生产用法CMS和G1
  • 原文地址:https://www.cnblogs.com/personnel/p/11443286.html
Copyright © 2011-2022 走看看