一个小的编程技巧,你知道吗?

        今天看linux文件系统的代码,有一个小地方引起了我的注意。记在这里,跟大家分享下。

       大体上是这样子的(示例代码如下)。一个函数接受一个const char*参数,然后在函数体内又分配了一个局部的const char *指针,并将刚才传入的参数付给它,然后依次去访问(准确的讲是读取)其指向的字符串中的每个字符。当时我就怀疑为什么还要申请一个局部变量呢?这不是更加浪费内存么?直接用传入的实参不是可以达到同样的目的么?

示例代码:

    void foo(const char *str){

        const char *temp = str;

        while(*temp++){

...............

        }

................

        但后来一想,觉得这样可能更方便编译器去做优化(因为采用局部变量,其实是给编译器的一种暗示,让他把该变量放到寄存器中去)。推测归推测,还是得验证一下。打开vi,写测试代码,gcc编译,并用objdump -d 查看反汇编,定位到函数<foo>,发现果然如我所料。

        在不采用任何优化选项的情况下:

        1:如果不使用temp变量,如下面所示,你会发现编译器生成的代码中,每次循环会把ebp+0x10地址处的内容加1,然后取其内容并用间接寻址。

    void foo(const char *str){

        while(*str++){

...............

        }

................


        2:如果使用temp变量,则编译器会把temp变量优化寄存器中,且每次循环都会只增加寄存器中的值并按照寄存器间接寻址来访问每个字符。

        可见,使用局部变量,确实有助于编译器进行优化。

 

        不过,我们也不能低估了我们编译器的能力。现在的编译器跟以前相比,智能了很多,能够做很多优化。比如还是上面的例子,如果不使用temp变量,但是只要打开gcc的O2优化选项,编译器便会自动的将变量优化到寄存器中去。

        总结一下:此处虽然用-O2也可以达优化的效果,但是如果程序稍微大起来,编译的时间消耗还是很“可观”的。本文提到的这个问题虽然看似很小,甚至有人可能会觉得不可一提,但我觉得任何一个严肃的程序员应该都不会一笑了之。这里体现了计算机体系结构中一个非常重要的思想——局部性原理,没有它,我甚至不敢想象现在的计算机会是什么样子。好了,再扯就远了,到此为止,希望本文对大家有点帮助。

 

BTW:水平有限,欢迎拍砖^_^

 

转载请注明转自:http://blog.csdn.net/qingheuestc


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值