免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lipingtababa
打印 上一主题 下一主题

[C++] 你们的代码会用引用吗? [复制链接]

论坛徽章:
0
71 [报告]
发表于 2008-11-20 16:18 |只看该作者
(转)看看编译器对指针和引用分别做了些什么:

  结果是一样的,但是中间的具体实现过程是有所不同的。   
  参数传递指针时将直接对指针指向的地址进行操作   
  传递指针的引用时,通过间接寻址,来实现对[指针指向的地址]进行操作。   
  看看下面一段程序反汇编后的内容就很清楚了   
   
  #include   <iostream>   
  using   namespace   std;   
   
  void   f1(int   *&a)   
  {   
          int   *b;   
          b=a;   
  }   
   
  void   f2(int   *a)   
  {   
          int   *b;   
          b=a;   
  }   
   
  void   main()   
  {   
          int   m=10;   
          int   *n=&m;   
   
          f1(n);   
          f2(n);   
   
  }   
  //---------------------------------------------------------------------------   
   
   
  *   Referenced   by   a   CALL   at   Address:   
  |:00401187         
  |   
  :00401150   55                                             push   ebp   
  :00401151   8BEC                                         mov   ebp,   esp   
  :00401153   51                                             push   ecx   
  //[ebp+08]即为压栈内容:n的有效地址   
  :00401154   8B4508                                     mov   eax,   dword   ptr   [ebp+08]   
  //取得主函数中m的有效地址--》edx   
  :00401157   8B10                                         mov   edx,   dword   ptr   [eax]   
  //b=a;   
  :00401159   8955FC                                     mov   dword   ptr   [ebp-04],   edx   
  :0040115C   59                                             pop   ecx   
  :0040115D   5D                                             pop   ebp   
  :0040115E   C3                                             ret   
   
   
  *   Referenced   by   a   CALL   at   Address:   
  |:00401190         
  |   
  :00401160   55                                             push   ebp   
  :00401161   8BEC                                         mov   ebp,   esp   
  :00401163   51                                             push   ecx   
  //取得压栈内容:n的有效内容(即m的有效地址)   
  :00401164   8B4508                                     mov   eax,   dword   ptr   [ebp+08]   
  //b=a;   
  :00401167   8945FC                                     mov   dword   ptr   [ebp-04],   eax   
  :0040116A   59                                             pop   ecx   
  :0040116B   5D                                             pop   ebp   
  :0040116C   C3                                             ret   
   
   
  --------------->函数开始<----------------------------   
  :00401170   55                                             push   ebp   
  :00401171   8BEC                                         mov   ebp,   esp   
  :00401173   83C4F8                                     add   esp,   FFFFFFF8   
  int   m=10;   
  :00401176   C745FC0A000000                     mov   [ebp-04],   0000000A   
  int   *n=&m;   
  :0040117D   8D45FC                                     lea   eax,   dword   ptr   [ebp-04]   
  :00401180   8945F8                                     mov   dword   ptr   [ebp-08],   eax   
  f1(n);   
  //由于形参是引用变量,所以将n的有效地址压栈   
  :00401183   8D55F8                                     lea   edx,   dword   ptr   [ebp-08]   
  :00401186   52                                             push   edx   
  :00401187   E8C4FFFFFF                             call   00401150   
  :0040118C   59                                             pop   ecx   
  f2(n);   
  //由于形参是指针变量,所以将n的有效内容压栈(即m的有效地址)   
  :0040118D   FF75F8                                     push   [ebp-08]   
  :00401190   E8CBFFFFFF                             call   00401160   
  :00401195   59                                             pop   ecx   
  :00401196   59                                             pop   ecx   
  :00401197   59                                             pop   ecx   
  :00401198   5D                                             pop   ebp   
  :00401199   C3                                             ret   

论坛徽章:
0
72 [报告]
发表于 2008-11-20 16:21 |只看该作者
无论你传值还是传指针,函数都会生成一个临时变量,   
  但传递一个指针的引用时,不会生成临时变量~~~

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
73 [报告]
发表于 2008-11-20 18:33 |只看该作者
void   f1(int   &a);
  void   f2(int   *a);
LS怎么不试一下反汇编上面这种写法?

论坛徽章:
0
74 [报告]
发表于 2008-11-20 18:38 |只看该作者
没有研究

论坛徽章:
0
75 [报告]
发表于 2008-11-20 21:36 |只看该作者
reference is designed for operator like <<

论坛徽章:
0
76 [报告]
发表于 2008-11-20 22:21 |只看该作者
看情况定,大的原则似乎书上有。

在战斗中成长

来学习的

论坛徽章:
0
77 [报告]
发表于 2008-11-20 23:21 |只看该作者
学C之前,觉得C++中的引用很好很强大;在我做了一年多的C开发工作之后,已经觉得引用不过如此,更喜欢指针!
abncat 该用户已被删除
78 [报告]
发表于 2008-11-21 09:36 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
79 [报告]
发表于 2008-11-21 13:59 |只看该作者
引用, 是你一个信任的朋友, 指针, 可能哪天会指向某个茅坑.

论坛徽章:
0
80 [报告]
发表于 2008-11-21 20:03 |只看该作者
原帖由 lipingtababa 于 2008-11-18 17:14 发表
我学习C++的时候,已经学习了C,对C的指针有些基本可用的理解,其程度相当于可以使用指针写代码,但不是很理解函数的参数传递机理.

那时候怎么也不明白为什么C++要引入引用,我坚持认为引用肯定有独特之处,之所以 ...




我认为c++引入引用恰恰是和你说的相反,不是因为指针不够强大,而是因为指针太强大了,以至于经常给程序带来潜在的bug,所以才引入引用的

一个很简单的例子,虽然完成同一个传参的工作指针和引用都能完成,但是由于使用了引用之后并不像指针那样可以随意改变指针本身的值可以更好的减少程序的bug,


当然了,如果你是一个高手保证用指针不会出错,那都差不多了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP