社区
C++ 语言
帖子详情
请问:指针和引用哪个效率更高?
LearnBeing
2004-08-06 01:31:12
如题!
...全文
1106
46
打赏
收藏
请问:指针和引用哪个效率更高?
如题!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
46 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
牧秦丶
2010-06-01
打赏
举报
回复
[Quote=引用 44 楼 baconbally 的回复:]
“一个都不能少”——说的非常好!!!!!
指针不能抛,该用引用就用它。
[/Quote]
antijpn
2004-08-09
打赏
举报
回复
回复人: FreeFice(庄鱼) ( ) 信誉:100 2004-08-09 02:44:00 得分: 0
哈!有意思!用指针或是饮用,完全是个人的习惯,在哪种场合用起来更方便顺手。
至于效率之争,与编译器在处理这类问题的策略有关,这里的汇编代码也仅仅说明了某种编译策略。争这个能说明什么?难道你会用指针代替引用,或是引用取代指针?想想这个结果,楼上的各位难道不觉得荒唐吗?
我们编程的目的是什么?是写出让人一眼就看懂、明了、便于维护的、安全健壮的代码。这就要我们从语义上多推敲代码的可读性。从这个层面上说,指针、引用一个都不能少。
C++要是连最后的这点效率都放弃了,那还是C++吗?干脆向无效率的Java靠拢好了
而且C里面根本没有这些乱七八糟的特性,还不是用的人一大堆?嵌入式谁用C++啊?
庄鱼
2004-08-09
打赏
举报
回复
哈!有意思!用指针或是饮用,完全是个人的习惯,在哪种场合用起来更方便顺手。
至于效率之争,与编译器在处理这类问题的策略有关,这里的汇编代码也仅仅说明了某种编译策略。争这个能说明什么?难道你会用指针代替引用,或是引用取代指针?想想这个结果,楼上的各位难道不觉得荒唐吗?
我们编程的目的是什么?是写出让人一眼就看懂、明了、便于维护的、安全健壮的代码。这就要我们从语义上多推敲代码的可读性。从这个层面上说,指针、引用一个都不能少。
baconbally
2004-08-09
打赏
举报
回复
up
Vigorcsdn
2004-08-08
打赏
举报
回复
同意,指针和引用的效率是一样的.
其实它们都是间接的(通过地址)操作对象,
因为指针在某些方面,比如在重载底层的运算符号的时候,不能得到和底层的运算符号一样的直观性,所以设计了引用.
第二个考虑是,指针的操作有一定的危险性.
引用具有指针的功能,但是不需要指针的语法.不过,具体哪个好,还是要看实际情况了.
jjyyis
2004-08-08
打赏
举报
回复
从汇编代码上很容易看出这两种的性能是一样的。
iwdc
2004-08-08
打赏
举报
回复
mark
redleaves
2004-08-08
打赏
举报
回复
晕倒,这个都争。
对于最终生成的代码来说,针指和引用就是一个东西。
只是在C++的语意和语法上不太一样,引用的意义基本上也就像micropentium6(小笨|想学ASP) 说的那样,为了某些场合好看,好写。
而且在大多数情况下,是不提倡使用引用的。因为没人能保证引用是有效的,引用会让人忘记检查目标的有效性。
antijpn
2004-08-08
打赏
举报
回复
定义的时候产生的代码的确是一样的,但是到了执行的时候的代码就完全不一样了,参看我的例子
我给出两个文件
//reference.cpp
void main()
{
int ival;
int &iref=ival;
iref++;
}
//pointer.cpp
void main()
{
int ival;
int *ptr=&ival;
*ptr++;
}
然后是汇编代码的主要部分
//reference.asm
; Line 2
push ebp
mov ebp, esp
sub esp, 8
; Line 4
lea eax, DWORD PTR _ival$[ebp]
mov DWORD PTR _iref$[ebp], eax
; Line 5
mov ecx, DWORD PTR _iref$[ebp]
mov edx, DWORD PTR [ecx]
add edx, 1
mov eax, DWORD PTR _iref$[ebp]
mov DWORD PTR [eax], edx
//pointer.asm
; Line 2
push ebp
mov ebp, esp
sub esp, 8
; Line 4
lea eax, DWORD PTR _ival$[ebp]
mov DWORD PTR _ptr$[ebp], eax
; Line 5
mov ecx, DWORD PTR _ptr$[ebp]
add ecx, 4
mov DWORD PTR _ptr$[ebp], ecx
可以看到,在前面的定义引用和指针产生的代码上面,可以说两个代码完全一样,自然在效率上也没有差别,但是看到后面的通过引用或者指针进行递增的时候,明显是使用指针的程序产生的代码更少,这样的话,自然效率也更高。我是在VC++7.1的编译器上通过的,其他编译器我没有试,不过对于这种代码应该差别不大。
所以应该是使用引用的效率不如使用指针的。
另外,楼上micropentium6说的一点不错,C++ Primer和Inside the C++ Object Model里面都讨论过这个问题,引用给操作符重载时候的语法提供了极大的便利。
Winner25
2004-08-07
打赏
举报
回复
指针和引用的效率在执行时肯定是一样的,当时 Bjarne Stroustrup 设计引用时的目的就是为了让开发者开发更安全的代码,并没有效率上的考虑,而且其实现也是一样的,从逻辑上说
你要索引一个内存中的变量,只可能通过地址,除非,在pe文件中生成一个对象的列表,可以通过表索引,但如果这样就回带来二级索引的效率降低,并且c++编译器对引用的处理也没有这样做!
如同 robin97(smile) ,你把pe文件 反编译,看一下什么都清楚了!
cpsoft
2004-08-07
打赏
举报
回复
呵呵,这个只能说和编译器有关!
ctan
2004-08-07
打赏
举报
回复
一样的,
程序编译时, 会将引用转换成指针, 所以执行效率是一样的
wodeyouxian
2004-08-07
打赏
举报
回复
别名在意义是一个静态指针
至于效率应该具体来看你做什么工作了,只是指向一个变量或是对像,那么时间上差不多,仅有的区别的指针的转换,在空间上只是指针的保存。别名也是有代价的
robin97
2004-08-07
打赏
举报
回复
class _test
{
public:
int n;
int m;
int j;
void test1(){}
};
int test(_test & n,_test * p);
void main()
{
// 看看这样的代码,谁都能看出错误,但是,各位编译执行看看
// 看看所谓的引用能不能赋值
_test * t = 0;
_test & pt = *t;
test(pt,t);
}
int test(_test & n,_test * p)
{
n = *p; // 看看这里,引用不能赋值?该换换思维了
n.test1();
return 0;
}
hewittlee
2004-08-07
打赏
举报
回复
the same!
Liulingbing
2004-08-07
打赏
举报
回复
内部是一样的。
这是一段汇编后的代码。
; 3 : int nInt;
; 4 : int * pInt = &nInt;
lea eax, DWORD PTR _nInt$[ebp]
mov DWORD PTR _pInt$[ebp], eax
; 5 : int & rInt = nInt;
lea ecx, DWORD PTR _nInt$[ebp]
mov DWORD PTR _rInt$[ebp], ecx
say_04
2004-08-07
打赏
举报
回复
引用的效率更好,在子函数中无须临时变量,但是指针有引用无可比拟的优势,指针可以赋值,引用是不可以的。
小笨和漂向北方
2004-08-07
打赏
举报
回复
坛子里很久以前久有过这样的讨论,当时也是一位大哥拿出了汇编来说明问题,证明引用的底层实现就是用指针。
我倒是看过一篇文章,比较偏激,他认为c++之所以引入引用的目的是为了运算符重载。
比如,如果重载了运算符号=
class A;
A a,b;
b=a;
而没有引用,你又不想付出一个临时对象的代价,就要使用指针,于是赋值重载赋值的语法看上去就是这样了:
A b=&a;
为了避免这个很别扭的语法,所以c++引入了引用这个概念^_^
lzzqqq
2004-08-07
打赏
举报
回复
这种问题还要问啊?
当然是指针啊。。。
指针就是地址啊,还有比什么找地址更快的呢?
你程序的常量经过编译后在PE文件里的二进制指令里面不就是地址吗?
FlyindanceDDr
2004-08-07
打赏
举报
回复
赞robin97(smile)
加载更多回复(26)
免费下载:C语言难点分析整理.doc
1. C 语言中的
指针
和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中
指针
和
引用
的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态增长 44 11. C语言中的位运算 46 12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. C语言复杂表达式的执行步骤 66 16. C语言字符串函数大全 68 17. C语言宏定义技巧 89 18. C语言实现动态数组 100 19. C语言笔试-运算符和表达式 104 20. C语言编程准则之稳定篇 107 21. C语言编程常见问题分析 108 22. C语言编程易犯毛病集合 112 23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与return的差别 141 30. extern与static存储空间矛盾 145 31. PC-Lint与C\C++代码质量 147 32. spirntf函数使用大全 158 33. 二叉树的数据结构 167 34. 位运算应用口诀和实例 170 35. 内存对齐与ANSI C中struct内存布局 173 36. 冒泡和选择排序实现 180 37. 函数
指针
数组与返回数组
指针
的函数 186 38. 右左法则- 复杂
指针
解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44.
指针
与数组学习笔记 222 45. 数组不是
指针
224 46. 标准C中字符串分割的方法 228 47. 汉诺塔源码 231 48. 洗牌算法 234 49. 深入理解C语言
指针
的奥秘 236 50. 游戏外挂的编写原理 254 51. 程序实例分析-为什么会陷入死循环 258 52. 空
指针
究竟指向了内存的哪个地方 260 53. 算术表达式的计算 265 54. 结构体对齐的具体含义 269 55. 连连看AI算法 274 56. 连连看寻路算法的思路 283 57. 重新认识:指向函数的
指针
288 58. 链表的源码 291 59. 高质量的子程序 295 60. 高级C语言程序员测试必过的十六道最佳题目+答案详解 297 61. C语言常见错误 320 62. 超强的
指针
学习笔记 325 63. 程序员之路──关于代码风格 343 64.
指针
、结构体、联合体的安全规范 346 65. C
指针
讲解 352 66. 关于指向
指针
的
指针
368 67. C/C++ 误区一:void main() 373 68. C/C++ 误区二:fflush(stdin) 376 69. C/C++ 误区三:强制转换 malloc() 的返回值 380 70. C/C++ 误区四:char c = getchar(); 381 71. C/C++ 误区五:检查 new 的返回值 383 72. C 是 C++ 的子集吗? 384 73. C和C++的区别是什么? 387 74. 无条件循环 388 75. 产生随机数的方法 389 76. 顺序表及其操作 390 77. 单链表的实现及其操作 391 78. 双向链表 395 79. 程序员数据结构笔记 399 80. Hashtable和HashMap的区别 408 81. hash 表学习笔记 410 82. C程序设计常用算法源代码 412 83. C语言有头结点链表的经典实现 419 84. C语言惠通面试题 428 85. C语言常用宏定义 450
改善程序设计技术的50个有效做法(CC++)(free)
PPT文档,改善程序设计技术的50个有效做法
【c++入门】
指针
的好盆友:
引用
作为函数的参数:当函数需要修改其参数的值时,可以将
引用
作为参数传递给函数。这样,函数对
引用
的操作实际上是对原始变量的操作,而不是对原始变量的副本进行操作。这种方式可以避免数据的拷贝,提高
效率
。简化
指针
操作:通过
引用
,可以更简洁地操作
指针
。例如,可以将一个数组的
引用
传递给函数,使得函数可以直接访问数组元素,而不需要使用
指针
来解
引用
。作为函数的返回值:可以将
引用
作为函数的返回值。当函数返回一个临时对象时,可以通过
引用
返回该临时对象,避免了返回临时对象所占用的存储空间被重复使用的情况。
数组的访问-下标访问和
指针
引用
访问哪个更快?
昨天我们上c语言课,老师在讲数组的访问的时候,说到:数组的
指针
访问比下标访问更快原话在谭浩强先生的c程序设计第五版-p229最初我对这个有点疑问:
指针
访问不应该是间接访问问嘛?为什么会比下标直接放更快呢?课后我去问老师,老师说因为下标访问需要计算位置,int类型加4字节,而
指针
只需要找门牌号,
效率
更高
……这样似乎合情合理,但事实真的是这样吗? 后来我决定设计一个程序测试一下,我开了一个10万的数组,为了保证真实性,使用devc++,使用随机数赋值,然后访问()逐一遍历,可是事实并没有如我所愿,于是我试了二十
引用
与
指针
有什么区别?
引用
与
指针
有什么区别?
指针
和
引用
都是地址的概念,
指针
指向一块内存,它的内容是所指内存的地址;
引用
是某块内存的别名。 程序为
指针
变量分配内存区域,而不为
引用
分配内存区域。
指针
使用时要在前加 * ,
引用
可以直接使用。
引用
在定义时就被初始化,之后无法改变;
指针
可以发生改变。 即
引用
的对象不能改变,
指针
的对象可以改变。 没有空
引用
,但有空
指针
。这使得使用
引用
的代码
效率
比使用
指针
的
更高
...
C++ 语言
65,184
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章