小品: 关于C++引用

news/2024/7/4 13:18:48
此文缘起我看了这篇文章:
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 这样的引用类型变量, 只可在初始化时赋值, 且只能赋值一次.






http://www.niftyadmin.cn/n/3654629.html

相关文章

搞懂Js中的this,call和apply方法

为了更好的看懂这篇文章,建议先要理解js对象的原型和原型链相关的知识,若不了解,可以看上一篇文章《js对象的构造函数与原型》 this的理解 在全局中使用this,this为window对象谁调用了对象中属性,this就是谁this.xxx…

Lua入门系列----pil学习笔记之Getting Start

本文作者:sodme本文出处:http://blog.csdn.net/sodme声明: 本文可以不经作者同意, 任意复制, 转载, 但任何对本文的引用都请保留文章开始前三行的作者, 出处以及声明信息. 谢谢.很多高深的人物都说过类似的话:"语言层面的东西, 都是表面的东西, 最核心的是设计模式, 是算法…

js中hasOwnProperty和instanceof的使用

hasOwnProperty hasOwnProperty方法是用来判断某个属性是否是属于自身对象的,该方法仅用于判断自身对象,不会查找原型链。 案例如下: Person.prototype.name 原型 Person.prototype.myFc function(){}function Person(){this.age 18this.…

Lua入门系列----pil学习笔记之 Type and Values (1)

本文作者:sodme本文出处:http://blog.csdn.net/sodme声明: 本文可以不经作者同意, 任意复制, 转载, 但任何对本文的引用都请保留文章开始前三行的作者, 出处以及声明信息. 谢谢.参考资源:http://www.lua.org/pil/ 一 个小小的脚本语言都能玩出这么多花样来&#xff…

js函数中的形参,实参和arguments对象

形参:形式参数,是函数作用域内的变量。 实参:调用函数时,传入的参数,有对应的形参时,实参会赋值给形参。 案例: var MyF function(a){} //a为形参MyF(1) //1为实参在javascript中的函数中&…

对标号地址的另一种相对寻址方式

汇编程序中, 对数据访问时, 通常是这样的:_asm{...DATA_LABLE:_emit 0x87_emit 0xa0_emit 0x49_emit 0x90...mov ebx, dword ptr [DATA_LABLE]...}其中, 当程序编译之后, mov指令中的DATA_LABLE标号地址会被转成一个绝对地址. 而有时绝对地址这一点可能会对这样一种需求带来障碍…

callee和caller的使用

callee callee是arguments对象中的一个方法,功能是引用arguments所在的函数。 案例: //命名函数 function fn(){console.log(arguments.callee)} fn() 结果如下: //ƒ fn(){console.log(arguments.callee)}//匿名函数 (function(){console.l…

高性能网络编程MailList 热点回顾 [1]

早在今年2月份, 鉴于国内服务器程序开发的同仁一直以来都没有一个固定的场所可以互相交流, 我在google group上建了一个有关高性能网络编程的maillist (加入的方法见这里), 现已经加入的600多名成员中, 所属领域较为广泛: 有从事网游服务器开发的, 有从事IM服务器开发的, 也有…