社区
C++ 语言
帖子详情
请问:指针和引用哪个效率更高?
LearnBeing
2004-08-06 01:31:12
如题!
...全文
1084
46
打赏
收藏
请问:指针和引用哪个效率更高?
如题!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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语言】
引用
和
指针
的区别?
指针
和
引用
都是地址的概念,
指针
指向一块内存,它的内容是所指内存的地址;
引用
是某块内存的别名。 程序为
指针
变量分配内存区域,而不为
引用
分配内存区域。
指针
使用时要在前加 * ,引..
【面经总结c/c++】
引用
和
指针
的区别?用
引用
传参有哪些好处?
(参考《程序员面试宝典》) 1.非空区别:在任何情况下都不能使用指向空值的
引用
。一个
引用
必须总是指向某些对象。因此如果你使用一个变量并让它...这意味着,使用
引用
的
效率
比使用
指针
高。 2.合法性区别:在使...
数组的访问-下标访问和
指针
引用
访问哪个更快?
课后我去问老师,老师说因为下标访问需要计算位置,int类型加4字节,而
指针
只需要找门牌号,
效率
更高
……这样似乎合情合理,但事实真的是这样吗? 后来我决定设计一个程序测试一下,我开了一个10万的数组,为了保证...
指针
与
引用
的区别
二、
引用
和
指针
的区别与联系 1.
引用
和
指针
有什么区别? 本质:
引用
是别名,
指针
是地址,具体的: ①从现象上看,
指针
在运行时可以改变其所指向的值,而
引用
一旦和某个对象绑定后就不再改变。这句话可以理解为:
指针
...
C++ 语言
64,683
社区成员
250,491
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章