引用类型

来源:互联网 发布:网络电影发行协议 编辑:程序博客网 时间:2024/04/20 05:36

(以下文章是我个人在学校开的一个《C++语义学》培训班里使用的讲义,没有作文字上的修饰,该讲义包括50多篇文章,大多采用实例的方式解释说明,看到有人问起这个问题,故将它发布出来。)

引用(reference)有时候又称为别名(alias),它可以作为对象的另一个名字。我们可以通过引用(对象的另一个名字)间接的操纵对象,它的使用方式类似于指针,但是不需要指针的语法。

定义方式:类型 & 变量 = 变量。如下图所示。

我们来直接看看它们的内存表现。

引用类型

如上面所述的栈的表现技法。我们可知,如果引用(ref)只是变量(n)的别名的话,那么n和p自身的地址只能差别4个字节(32位机器)。可是现在看图可知,它们差8个字节。什么原因呢?

请注意0x001278 地址内容的变化(当前值是cccccccc)

接着向下执行.

引用类型

地址ox001278的四个字节的内容变了,现在为7cff1200->即0012ff7c,即n的地址。

呵呵,你该知道,引用也是一个变量,它也占空间了吧。

只不过我么无法访问,编译器自动给我们分配的空间而已。

可是&ref 的显示却是和n的地址相同。

这只不过是C++障人耳目的伎俩而已!―――它要让你觉得使用对象的引用和使用对象本身没什么区别。

下面我们再来看看,使用引用。加入最后一行代码。

引用类型

反汇编后成如下样子:

引用类型

让我们来分析一下:

当前:EBP = 0012FF80

      EBP – 8 = 0012FF78 (ref自身的地址)

      EBP – 10h = 0012FF70 (Last的地址)

上面几行汇编的意思,大概你已经猜出来了(是啊,我也是猜出来的)。

1:将ref自身的地址传到EDX.

2:将EDX存放的地址的内容,传给EAX。

3:将EAX的内容传给Last。

这和指针又有什么区别呢?从反汇编状态来看看指针和引用不就知道了!

引用类型

有区别吗?--没有。(从C++编译器实现和汇编代码的角度)

 

总结:

从内存中(我没有太好的名词)看引用和指针没什么区别。从编译器的角度来看,有很多不同,比如我们可以知道指针变量的地址(&p),却不能找到引用自身的地址,编译器让我们感觉(请注意这个词),对引用的操作好像对变量的操作一样直接。

注:对引用应用更深层次的讨论,将在函数和类的重载运算符,拷贝构造函数等部分。(我不会轻易放过吸引我的东西)
原创粉丝点击