请问:指针和引用哪个效率更高?

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
  • 打赏
  • 举报
回复
引用的效率更好,在子函数中无须临时变量,但是指针有引用无可比拟的优势,指针可以赋值,引用是不可以的。
  • 打赏
  • 举报
回复
坛子里很久以前久有过这样的讨论,当时也是一位大哥拿出了汇编来说明问题,证明引用的底层实现就是用指针。

我倒是看过一篇文章,比较偏激,他认为c++之所以引入引用的目的是为了运算符重载。

比如,如果重载了运算符号=
class A;

A a,b;
b=a;

而没有引用,你又不想付出一个临时对象的代价,就要使用指针,于是赋值重载赋值的语法看上去就是这样了:

A b=&a;

为了避免这个很别扭的语法,所以c++引入了引用这个概念^_^


lzzqqq 2004-08-07
  • 打赏
  • 举报
回复
这种问题还要问啊?
当然是指针啊。。。
指针就是地址啊,还有比什么找地址更快的呢?
你程序的常量经过编译后在PE文件里的二进制指令里面不就是地址吗?
FlyindanceDDr 2004-08-07
  • 打赏
  • 举报
回复
赞robin97(smile)
加载更多回复(26)

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧