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 编译选项对递归调用优化的很智能化。

  • 相关阅读:
    Web前端 --- jQuery
    关于前端 jQuery 面试的知识点
    面试官:讲讲mysql表设计要注意啥
    Python中的单例模式的几种实现方式的及优化
    HTTP协议【详解】——经典面试题
    Web前端 --- BOM和DOM
    基于css文件编写一个简单的html前端页面
    Web前端 --- JavaScript
    Linux 命令(一) find&grep文件查找命令
    线程池
  • 原文地址:https://www.cnblogs.com/personnel/p/11443286.html
Copyright © 2011-2022 走看看