指针访问真的高效吗
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的值即可
不过话说回来如果形成良好的习惯,编写的每个函数体都不长,那么上条规则还是成立的。不过再贴近实际点,如今计算机性能日益强大,且脚本语言大行其道,好像讨论这个话题好像有点滑稽。
此文章仅代表个人的一些思考,欢迎各位朋友批评指正。
首先先看两段代码
(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 语言程序(二)
- 关于指针的一些事情
- 如何写好 C main 函数
- Lua和C语言的交互详解
- C# Pointer指针应用实例简述
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置