C++中引用底层浅析

首先,写这个只是自己记录学习的,第一次写博客,不当之处敬请指教。

正文:

在C++中我们会经常被问到引用和指针的区别,关于区别,一下是搜索的结果。

C++引用:

引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。引用(reference)是c++对C语言的重要扩充。引用就是某

一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。其格式为:类型 &引用变量名 = 已定义过的变量名。

引用的特点:

(1)&在此不是求地址运算,而是起标识作用。
(2)类型 标识符是指目标变量的类型。
(3)声明引用时,必须同时对其进行初始化。
(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。
int a=2,int &ra=a;
a为目标原名称,ra为目标引用名。给ra赋值:ra=1; 等价于 a=1;
(5)对引用求地址,就是对目标变量求地址。&ra与&a相等。即我们常说引用名是目标变量名的一个别名。别名一词好像是说引用不占据任何内存空间。但是编译器在一般将其实现为const指针,即指向位置不可变的指针。即引用实际上与一般指针同样占用内存。
(6)不能建立引用的数组。因为 数组是一个由若干个元素所组成的集合,所以无法建立一个由引用组成的集合。但是可以建立数组的引用.
下面主要是对第五点进行分析,引用实际上是占用一个指针大小的空间的,在汇编语言总其和指针完全一样。
void main()
{
int a = 1;
int &b = a;
int *p = &a;
}
这段代码转换成汇编语言:
int a = 1;
00CE4858  mov         dword ptr [a],1  
int &b = a;
00CE485F  lea         eax,[a]  
00CE4862  mov         dword ptr [b],eax  
int *p = &a;
00CE4865  lea         eax,[a]  
00CE4868  mov         dword ptr [p],eax  
}
可见从汇编分析中可以看出引用也是件a的地址存放到了一个指针中。另外从内存中观察:
struct A
{
int x = 1;
int y = 2;
int &b = x;
};


void main()
{
A sa;
printf("&x=%x,&y=%x,&b=%x,b=%x\n", &sa.x, &sa.y, &sa.y - 1, *(&sa.y - 1));
getchar();
}


输出结果:

可以看出引用实际上是分配空间的和指针一样 只不过这个这个地址空间是对程序透明的。所以所说的应用没有分配空间是相对于程序而言的。



 错误之处欢迎指教


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值