小品: 关于"C++引用"

来源:互联网 发布:linux 安装x264 编辑:程序博客网 时间:2024/03/29 05:51
此文缘起我看了这篇文章:
http://blog.csdn.net/newslxw/archive/2006/08/08/1038972.aspx

还记得当年读书时, 牛牛的C++老师告诉我: "引用, 其实就是别名, 与其所引用的对象完全等价". 可是, 我还是有这点疑问: "等价的含义, 是指的什么? 难道是说在最底层的实现上两者直接就是使用的同一个内存位置吗? " 比如下面的这段代码:

int main()
{
    
int a = 100;
    
int &= a;
    
int *= &a;
    b 
= 99;
    a 
= 88;
    b 
= 77;
    
*= 66;

    
return 0;
}




经过汇编后, 变成了这样:

main:
    leal    
4(%esp), %ecx
    andl    $
-16%esp
    pushl    
-4(%ecx)
    pushl    
%ebp
    movl    
%esp, %ebp
    pushl    
%ecx
    subl    $
16%esp
.LCFI5:
    movl    $
100-16(%ebp)      ; ebp-16 为变量 a 的地址
    leal    -16(%ebp), %eax
    movl    
%eax, -12(%ebp)      ; 将a的地址放在 ebp-12 地址处
    leal    -16(%ebp), %eax     
    movl    %eax, -8(%ebp)       ; ebp-8是指针c变量, 此句是给指针c赋值
    movl    -12(%ebp), %eax      ; 给引用b赋值前, 先把存在 ebp-12 的 a 的地址取到eax中
    movl    $99, (%eax)          ; b = 99
    movl    $88-16(%ebp)
    movl    -12(%ebp), %eax      ; 此处给引用b的赋值, 与前面一样, 也是先取a的地址
    movl    $77, (%eax)
    movl    
-8(%ebp), %eax       ; 给*c赋值前, 先取c地址
    movl    $
66, (%eax)          ; 此处执行 *c = 66
    movl    $
0%eax
    addl    $
16%esp
    popl    
%ecx
    popl    
%ebp
    leal    
-4(%ecx), %esp
    ret


由此可见, 引用, 在具体实现时, 会申请一个临时空间(栈内空间), 目的是存放被引用对象的地址. 当使用引用变量时, 其实就是对被引用对象作了一次间接寻址. 而从汇编代码中来看, *c 确实与 b 在使用时的汇编代码一样, 都是先取地址, 再将值存入此地址. 所不同的, 只是在c++层面, 作为如 b 这样的引用类型变量, 只可在初始化时赋值, 且只能赋值一次.





原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 法斗嘴唇破了怎么办 狗嘴巴周围红了怎么办 脸上起红包还痒怎么办 睾丸胀痛有下坠感怎么办 英语不好又不会读怎么办 七个月宝宝手上长倒刺怎么办 字母纹身纹反了怎么办 花甲生的吃了怎么办 别人告我欠他钱怎么办 实习手册没有公司的印章怎么办? 家长管的太严怎么办 对于老公沉迷于股票怎么办 月经期吃了香瓜怎么办 月经漏到内裤上怎么办 上班没时间养狗怎么办 宝宝呼吸道感染反复发烧怎么办 熬夜后头晕想吐怎么办 生气后全身无力酸痛怎么办? 久坐导致的腰疼怎么办 削土豆手变黑了怎么办 熬夜后头痛眼痛怎么办 孩子毎天通宵游戏怎么办 熬夜写作业困了怎么办 三十多岁白头发越来越多怎么办 AI界面字体太小怎么办 睡不着怎么办躺倒床上脑子混乱 作息规律不正常夜里睡不着怎么办 作息不规律引起身体痒怎么办 在大学里好无聊怎么办 开会时间通知错了怎么办 商场要求商户变更位置怎么办 怀孕初期症状小腹痛怎么办 1岁半宝宝吃夜奶怎么办 戒奶宝宝不喝奶粉怎么办 2岁半宝宝老晚睡怎么办 老是熬夜然后想调生物钟怎么办 一个月宝宝睡眠不好怎么办 个人怎么办一清pos机 社保到退休年龄未交满15年怎么办 退休时社保没交满15时怎么办 单位不支付病假工资怎么办