您的位置:首页 > 编程语言 > C语言/C++

指针访问真的高效吗

2015-11-30 19:23 330 查看
常常听闻使用指针更高效,但是这是事实吗?

首先先看两段代码

(1)  int   a  =  5;

            a  =  10;

  (2) int   a   =   5;

   int  *p  =  &a;

         *p  =  10;

这里我们但看两段代码的最后一行,两者的取值模型如下图

先讲代码的生成,在代码运行期间,函数的调用与执行都依赖于栈,在函数被调用时,函数的局部栈的开始地址是确定的,而变量a(或者p)对于栈顶的偏移在编译为可执行代码时就能够确定,所以可以认为运行时变量的地址都可以确定

对于第一段代码,如图一,生成的最终代码大致为:

A 、  通过变量a的地址(运行时确定,函数栈起始地址 加 变量相对的偏移)向a中写入10

对于第二段代码,如图一,生成的最终代码大致为:

A 、 通过变量p的地址(运行时确定,函数栈起始地址 加 变量相对的偏移)取得p的值,

B 、 通过p的值寻址得到 a 的内存,向 a 写入 10;

   通过上述比较,很明显可以发现在一般情况下,指针不比直接访问高效。

但是在一些情况下这句话是对的,比如在函数实参传递且实参的size比较大(大于指针的size)时,即参数传址比传值效率要高。我想最开始讲这句话的人以此为默认前提的。不过既然一般情况下直接访问比通过指针访问快一点,那么假如多次对入参进行操作,很显然又要打破这一箴言,并引发以空间换取效率的讨论。如下

void
f(double *arg);


double p;

f(&p);

 //在函数 f
中,每次取得参数p,需要先取得 arg值,然后通过参数arg得到取得 p 的值

void f2(double arg);

double p;

f(p);

 //在函数 f2 中,每次对取得参数p,仅需取得arg的值即可



不过话说回来如果形成良好的习惯,编写的每个函数体都不长,那么上条规则还是成立的。不过再贴近实际点,如今计算机性能日益强大,且脚本语言大行其道,好像讨论这个话题好像有点滑稽。

此文章仅代表个人的一些思考,欢迎各位朋友批评指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 指针