C++ 中引用的背后
几个问题:
1. 引用变量占有内存空间吗?
2. 引用是怎样工作的?
3. 指针是怎样工作的?
4. 引用和指针有什么区别?
《C++ Primer》里面是这样说的“引用(Reference)就是对象的另一个名字,引用只是它绑定的对象的另一个名字,作用在引用上的所有操作事实上都是作用在该引用绑定的对象上”,这句话概括得很彻底
一段C++代码:
使用 /FAs 编译选项,得到的汇编代码如下:
PUBLIC_main_TEXTSEGMENT_a$ = -4_ref$ = -8_mainPROC NEAR; 4 : int main() {pushebpmovebp, espsubesp, 8; 5 : int a = 100;movDWORD PTR _a$[ebp], 100; [ebp-4]是a的地址; 6 : int& ref = a;leaeax, DWORD PTR _a$[ebp]movDWORD PTR _ref$[ebp], eax; [ebp-8]是ref的内存地址,保存的是 a 的地址; 7 : ref = 5;movecx, DWORD PTR _ref$[ebp]; 先从ref的内存中取出 a 的地址movDWORD PTR [ecx], 5; 再对 a 进行间接的操作,直接影响了 a 的值
至于指针的话,自己去探索一下,其工作的机制是类似的4. 引用和指针的区别
引用和指针都是通过间接的手段直接影响原对象的。
1. 对于指针来说,指针可以不指向任何一个对象(指向NULL),而引用自初始化后就与某个对象绑定了,引用必须在定义的时候就进行初始化,因为引用本身不能与空对象进行绑定
2. 在某种程度上说,比如测试,引用的代码效率比指针高,因为引用总是与某个对象进行绑定,而指针则不然(这点摘自《More Effective C++》Item M1)
3. 引用自定义后就“从一而终”地与某个对象绑定,任何试图让其绑定其它对象的做法都是被禁止的;而指针是相当灵活的,它可以改变其指向的对象,在指针范畴上,不存在“绝对的绑定”
总的来说,如果你需要在任何时刻都能够改变指向的对象时,应该用指针而不是引用;如果你希望总是指向某个对象并且这个指向关系是“从一而终”的,那么你应该使用引用而不是指针