看完原文后的一个小结:
1. 引用是在编译的过程中被处理的,实际上就是在编译层面对程序员进行的一个比较友好的语法,而在实现上是由编译器完成了地址的传递,实质上还是指针。
2. 不能简单的理解为一个别名,我们可以这样用,但是要知道底层就是一个指针变量,是要占用内存空间的,和define是不一样的。
原文地址:
http://www.cnblogs.com/hoodlum1980/archive/2012/06/19/2554270.html
原文内容:
【声明】本文无技术含量!在博客园上回复某个帖子,招来他的非议,我不想去细究这个人的治学态度,不想去问去管他到底有没有修改过自己的文章,对我来说没必要。我只能说不负责任,态度自大的,不严谨的人是令我失望的。但是对于一个问题,这里涉及到了“引用”,这是C++引入的一种新的形式,可以说是给程序员的一个语法上的好处,但是我翻看了BS的《The C++ Programming Lanuage》,并没有看到对引用的实现的解释。所以虽然我一直默认为引用是这样实现的,但在对别人提出自己的观点之前,我需要验证自己的“猜想”。这个问题很好去验证,所以我先给出一个最简单的试验:用一个 int 类型的引用来说明问题。
输入下面的代码,我使用的是VC6.0:
复制代码
void ModifyNum(int& x)
{
x = x + 10;
}
int main(int argc, char* argv[])
{
int a = 5;
ModifyNum(a);
printf("a=%d\n", a);
return 0;
}
上面的代码将输出 a = 15,然后用 IDA 打开编译后的 exe 文件,查看函数 main 和 ModifyNum 的代码:
.text:00401060 main proc near ; CODE XREF: j_mainj
.text:00401060
.text:00401060 var_44 = dword ptr -44h
.text:00401060 var_4 = dword ptr -4
.text:00401060
.text:00401060 push ebp
.text:00401061 mov ebp, esp
.text:00401063 sub esp, 44h
.text:00401066 push ebx
.text:00401067 push esi
.text:00401068 push edi
.text:00401078 mov [ebp+var_4], 5
.text:0040107F lea eax, [ebp+var_4]
.text:00401082 push