在一般教材里面,我们会说引用是变量的别名,另外在 c++ primer 5里面说到引用的时候,说引用不是对象,不能对它进行取地址。但是我们来看看下面代码的分析:

 #include <iostream>

 int main(int argc, char* argv[])
{
int i = ;
int &qi = i;
int *pqi = &(&qi);
int *pi = &i; return ;
}

汇编结果:

 #include <iostream>

 int main(int argc, char* argv[])
{
00BC4350 push ebp
00BC4351 mov ebp,esp
00BC4353 sub esp,0F0h
00BC4359 push ebx
00BC435A push esi
00BC435B push edi
00BC435C lea edi,[ebp-0F0h]
00BC4362 mov ecx,3Ch
00BC4367 mov eax,0CCCCCCCCh
00BC436C rep stos dword ptr es:[edi]
int i = ;
00BC436E mov dword ptr [i],5Ah // wc: 将90 保存到 i 的内存单元
int &qi = i;
00BC4375 lea eax,[i]
00BC4378 mov dword ptr [qi],eax // wc: 将 i 的地址保存到 qi 的内存单元,这里可以说明引用也是有自己的内存空间的,
// wc: 它用来保存所绑定的对象的地址
int *pqi = &qi;
00BC437B mov eax,dword ptr [qi]
00BC437E mov dword ptr [pqi],eax // wc: 这里是将引用取地址给一个指针,我们可以看到,实际上是将 qi 内存单元里的值保存到 pqi 的内存单元,
// wc: 那么也就说,对一个引用取地址实际上是对其取值,取出它保存的所绑定对象的地址
// wc: 这也就说明了为什么对一个引用取地址得到的是指向其所绑定对象
int *pi = &i;
00BC4381 lea eax,[i]
00BC4384 mov dword ptr [pi],eax // wc: 将 i 的地址保存到 pi 的内存单元,这个是一般的对一个对象取地址 return ;
00BC4387 xor eax,eax
}

这么来说,引用的内部实现可能是常量指针,这样引用就是一个可以被自动解引用的指针。

表达式   int &qi = i; 将会被编译器转化成 int *const qi = &i; 而引用之所以要初始化是因为 const 类型变量必须初始化,这个指针也必须指向。我们还可以以另外一个程序来证明:

  #include <iostream>
using namespace std; struct Tq {
int &i;
double &j;
}; int main(int argc, char* argv[])
{
┊int *ptr;
┊cout << "size of pointer: " << sizeof(ptr) << endl;
┊cout << "size of Tq: " << sizeof(Tq) << endl; ┊ return ; }

运行结果:

size of pointer: 8

size of Tq: 16

可以看出,两个引用其实就是两个指针。而不是像书上说的引用不是对象。

以上的结果都说明,引用其实就是一个指针,基于引用一定要初始化和不能改变绑定,引用的实现应该是 const pointer,它是一个被自动解引用的指针,它的一系列引用操作由编译器来保证。

c++ 引用的分析的更多相关文章

  1. python的引用计数分析(二)

    python所有对象引用计数被减少1的情况: 一.对象的别名被赋予新的对象; a = 23345455 # 增加了一个引用 b = a # 增加了一个引用 print(sys.getrefcount( ...

  2. const 引用的分析

    const 引用: 在初始化常量引用时,允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可.尤其,允许为一个常量引用绑定非常量的对象.字面值,甚至是一个表达式.我们来看 const ...

  3. 20170305深圳Meetup Rails中CSS,JS引用关系分析

    新手上路,若有错误请及时提醒 Rails中CSS,JS引用关系分析 一.Rails静态文件存放位置 二.Rails中CSS引用方式 三.Rails中JS引用方式与CSS类似 四.上面都是默认引用app ...

  4. OC对象之旅 weak弱引用实现分析

    Runtime学习 -- weak应用源码学习   Runtime源码分析,带你了解OC实现过程.其中参考了大量的大神的代码以及文献,里面也有个人的见解,欢迎拍砖,欢迎交流. 两种常见使用场景 /// ...

  5. 集合中存的是引用,分析一道容易混淆的Java面试题

    我们自定义的类是以引用的形式放入集合,如果使用不当,会引发非常隐蔽的错误.就拿我经常问到的一个面试题来说明这个知识点. 第一步,我们定义一个Car类型的类,其中只有一个int类型id属性. 第二步,创 ...

  6. Java内部类持有外部类的引用详细分析与解决方案

    在Java中内部类的定义与使用一般为成员内部类与匿名内部类,他们的对象都会隐式持有外部类对象的引用,影响外部类对象的回收. GC只会回收没有被引用或者根集不可到达的对象(取决于GC算法),内部类在生命 ...

  7. JS中原始值和引用值分析

    JS中变量中两种类型的值:原始值,引用值 原始值是存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置. var x = 1; //1就是一个原始值,变量x中存放的就是原始 ...

  8. java中子类与父类中隐含的this引用的分析

    /* 看一下下面的程序,看是否你的答案和运行的答案是否一致! */ class Parent{ public int x; public Parent p; public Parent(){} pub ...

  9. Spring IOC 源码简单分析 03 - 循环引用

    ### 准备 ## 目标 了解 Spring 如何处理循环引用 ##测试代码 gordon.study.spring.ioc.IOC03_CircularReference.java   ioc03. ...

随机推荐

  1. bzoj1086-王室联邦

    题目 给出一棵树,求一种分块方案,使得每个块的大小\(size\in [B,3B]\).每个块还要选一个省会,省会可以在块外,但是省会到块内任何一个点路径上的所有除了省会的点都必须属于这个块.\(n\ ...

  2. 【bzoj4736/uoj#274】[清华集训2016]温暖会指引我们前行 语文题+LCT

    题目描述 http://uoj.ac/problem/274 题解 语文题+LCT 对于这种语文题建议还是自己读题好一些... 读懂题后发现:由于温度互不相同,最大生成树上的路径必须走(不走的话温度大 ...

  3. 【bzoj4008】[HNOI2015]亚瑟王 概率dp

    题目描述 $n$ 张牌,$r$ 轮游戏,每轮从左向右操作,遇到第 $i$ 张牌有 $p_i$ 的概率选中,选中会产生 $d_i$ 的贡献,丢弃掉该牌并结束这一轮,否则继续下一张.问最终的期望贡献. 输 ...

  4. BZOJ4823 CQOI2017老C的方块(最小割)

    如果将其转化为一个更一般的问题即二分图带权最小单边点覆盖(最小控制集)感觉是非常npc的.考虑原题给的一大堆东西究竟有什么奇怪的性质. 容易发现如果与特殊边相邻的两格子都放了方块,并且这两个格子都各有 ...

  5. 【刷题】BZOJ 1002 [FJOI2007]轮状病毒

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子 和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下 ...

  6. 【BZOJ1031】字符加密(后缀数组)

    [BZOJ1031]字符加密(后缀数组) 题面 BZOJ 洛谷 题解 把字符串倍长 然后直接求后缀数组, 拍好序之后直接输出就行了. (我只是复习一下\(SA\)而已) #include<ios ...

  7. 【单调队列】【P2627】 修剪草坪

    传送门 Wa这次竟然不是Uva的题 Description 在一年前赢得了小镇的最佳草坪比赛后,Farm John变得很懒,再也没有修剪过草坪.现在,新一轮的最佳草坪比赛又开始了,Farm John希 ...

  8. 关于equals与hashcode的重写

    我想写的问题有三个: 1.首先我们为什么需要重写hashCode()方法和equals()方法 2.在什么情况下需要重写hashCode()方法和equals()方法 3.如何重写这两个方法 **** ...

  9. 007.C++构造函数

    1.一个引例 //class head class complex //class body {} { public: complex(double r=0, double i) :re(r), im ...

  10. POJ 1753 BFS

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 44450   Accepted: 19085 Descr ...