Crazy迷恋. 发表于 2013-8-11 10:50:45

对C++中引用和指针的反汇编对比问题

本帖最后由 Crazy迷恋. 于 2013-8-11 11:18 编辑

今天闲着闹心,突然想到了一个问题。C++中的引用和指针。比如传送一个指针进一个函数是四个字节,传送一个引用就不一样了。它的大小就是引用变量的大小。最近学了点汇编,手痒~~~直接给反到汇编去了。为什么指针和引用是一样的呢?
反汇编结果如下:
int a;
a=5;
00CD1AAEmov         dword ptr ,5
int &b=a;
00CD1AB5lea         eax,
00CD1AB8mov         dword ptr ,eax
下边发一个指针:
int *p=NULL;
00CD1B3Bmov         dword ptr ,0
p=&a;
00CD1B42lea         eax,
00CD1B45mov         dword ptr ,eax
std::cin.get();
就是偏移地址不一样。其他都一样~~~差距咋这么大呢?
00CD1AB5lea         eax,
00CD1AB8mov         dword ptr ,eax
引用里边dword ptr ,eax同样给【b】这个地址传送一个地址。那它的大小也应该是一个地址的大小。很费解啊~~~

zer0 发表于 2013-8-11 10:50:46

7:      int a;
8:      a = 5;
00401598   mov         dword ptr ,5
9:      int &b = a;
0040159F   lea         eax,
004015A2   mov         dword ptr ,eax
10:
11:       int *p = NULL;
004015A5   mov         dword ptr ,0
12:       p = &a;
004015AC   lea         ecx,
004015AF   mov         dword ptr ,ecx
13:       p = &b;
004015B2   mov         edx,dword ptr
004015B5   mov         dword ptr ,edx

从这段代码中,我们可以看出如果定义(我认为引用变量占用空间,故称之为定义)一个引用变量,你可以看到b在上述代码中相当于,实际引用变量在内存中已经申请占了4个字节的空间。那些变量、常量、空语句神马的都会在编译后占用空间,从这点看 同一个变量多次 引用就要占内存。但是这时引用变量在编译以后 直接对引用的对象操作,这时就是他操作的时候占用的空间就是源对象本身的空间,并没有增加申请新的空间来保存临时的,因此没占用过内存空间。

其实占用不占用内存空间两个都对,因为C++标准里面并没有规定。可能也被编译器优化的很好后不占用内存。

望采纳~~~不懂可以追问{:5_91:}

竹林小溪 发表于 2013-8-11 13:00:57

zer0 发表于 2013-8-11 10:50 static/image/common/back.gif
7:      int a;
8:      a = 5;
00401598   mov         dword ptr ,5


说了那么多,还是没看懂

zer0 发表于 2013-8-11 13:18:18

竹林小溪 发表于 2013-8-11 13:00 static/image/common/back.gif
说了那么多,还是没看懂

占用不占用内存空间两个都对,看你怎么理解~

占用内存 :你申请这个变量b肯定是占用了4字节内存

不占用内存: 在你操作这个引用变量的时候 不会使用额外的空间,不会再申请新的内存空间~

差不多这个意思吧

沉思者 发表于 2013-8-13 10:58:03

不好意思,最近太忙,没什么时候上网……
看来问题解决了,我最起码不自责了……

Crazy迷恋. 发表于 2014-8-25 21:02:31

沉思者 发表于 2013-8-13 10:58
不好意思,最近太忙,没什么时候上网……
看来问题解决了,我最起码不自责了……

?我去者么久不见你出来逛了
页: [1]
查看完整版本: 对C++中引用和指针的反汇编对比问题