不要做优化了!让编译器去干吧!

简介: 我们日常写代码时,经常自己去做一些优化,其实绝大多数情况都是没必要的,因为编译器比你想的聪明太多! 下面这个例子就是明证, 这个是一个求竭诚的递归写法,很多老手都会告诉你这样写性能低,应该用循环。

我们日常写代码时,经常自己去做一些优化,其实绝大多数情况都是没必要的,因为编译器比你想的聪明太多!

下面这个例子就是明证,

这个是一个求竭诚的递归写法,很多老手都会告诉你这样写性能低,应该用循环。

int rfact(int x)

{

    int rval;

    if(x<=1)

        return 1;

    rval=rfact(x-1);

    return rval*x;

}

 

我想大家一般都不会有什么异议,那么来看看生成的代码是什么样子吧!

编译方法 gcc –O2 –S rfact.c

我只贴上关键的汇编代码,看看是不是毁三观!

_rfact:

    movl    4(%esp), %edx

    movl    $1, %eax

    cmpl    $1, %edx

    jg    L3

    jmp    L2

    .p2align 4,,7

L9:

    movl    %ecx, %edx

L3:

    leal    -1(%edx), %ecx

    imull    %edx, %eax

    cmpl    $1, %ecx

    jne    L9

L2:

    rep ret

 

看到了吧,没有递归,没有递归,没有递归! 编译器帮你转换成循环了。 当然编译不能把所有的递归都转换成循环,但是可以看出大多数的优化真心没必要,只会带来错误, 比如使用右移来代替除法之类的,这些真心out了!

再给你看一个编译器优化的例子,比你想的聪明多了。

int choice3(int x)

{

    return 15*x;

}

你觉得这里编译器会用乘法?那你错了!你错了!你错了!

_choice3:

    movl    4(%esp), %edx

    movl    %edx, %eax

    sall    $4, %eax

    subl    %edx, %eax

    ret

看到了么?乘以16-1,聪明吧。

目录
相关文章
|
4月前
|
编译器 Serverless C++
从汇编角度看函数调用过程
从汇编角度看函数调用过程
|
7月前
|
存储 编译器 程序员
C语言——程序环境和预处理(再也不用担心会忘记预处理的知识)
C语言——程序环境和预处理(再也不用担心会忘记预处理的知识)
|
7月前
|
存储 自然语言处理 算法
通过实际的例子,介绍编译器的工作过程
通过实际的例子,介绍编译器的工作过程
44 0
|
8月前
|
测试技术 编译器 C++
栈局部变量优化探究,意外发现了 vs 的一个 bug ?
栈局部变量优化探究,意外发现了 vs 的一个 bug ?
|
12月前
|
存储 C语言
写C语言代码时,肯定值得你注意的点
写C语言代码时,肯定值得你注意的点
编程基本功:即使是脚本,也尽量减少硬代码,都使用变量
编程基本功:即使是脚本,也尽量减少硬代码,都使用变量
46 0
|
自然语言处理 编译器
进入编译器后,一个函数经历了什么?
进入编译器后,一个函数经历了什么?
75 0
进入编译器后,一个函数经历了什么?
|
自然语言处理 编译器
|
程序员 C语言 C++
你认为已经过时的C语言,是如何影响500万程序员的?
喜欢这篇文章的朋友可以多多收藏、点赞、关注 一条龙~
1122 0
|
C语言 C++
c语言几个松散的地方(不足的地方,不严谨的地方,它容易出错的地方)。
c语言是面向过程的语言,是弱类型语言,c语言的源代码基本就是无数个函数的堆砌。即很多函数就组成c语言源代码了,也即它的源代码基本就是函数构成的。 C语言里面的test()和test(void)是不一样的。
956 0