c++ 类中引用类型成员变量及所占内存大小

一直以来,在我的内心中,总是认为如果类中使用引用类型的成员变量,那对象将没有为该成员变量分配内存。我会这么想的原因如下:

#include<iostream>
using namespace std;

int main()
{
	int a=0;
	int &b=a;
	cout<<"a的地址:"<<&a<<endl;
	cout<<"b的地址:"<<&b<<endl;
}

上面的代码输出结果如下:

a的地址:0x7fff8d3f6544
b的地址:0x7fff8d3f6544

引用类型b的地址和其引用的变量a的地址相同。基于以上事实,我大胆的这么推测,定义某个类的对象后,该对象的引用类型成员变量和其引用的变量地址相同,又因为其引用的变量在其定义之前,也就是说,它引用的变量分配内存的时间要早于它分配内存的时间,当一个对象定义时,为这个对象分配的内存肯定是连续的,不可能会包含前面对象分配的内存,所以,该对象不会再为该引用类型的成员变量分配内存。

可是后来越想越不对劲,如果类对象中不包含这个包含这个成员,那总该分配些其他的空间用来提示这个成员引用的是哪个对象吧!如果完全没有提示,当调用该成员时,他怎么知道在哪取出对应的值呢?于是我做了下面的测试:

#include<iostream>
#pragma pack()
using namespace std;
class test{
	public:
		char &a;
		test(char &c):a(c){
		
		}
};

int main()
{
	char x='x';
	test t(x);
	cout<<"x的地址:"<<(void*)&x<<endl;
	cout<<"t.a的地址:"<<(void*)&t.a<<endl;
	cout<<sizeof(t)<<endl;
}

linux 64位环境下结果如下:

x的地址:0x7ffe885761df
t.a的地址:0x7ffe885761df
8

前面两行的输出证明了我之前的推断:引用类型的成员和被引用的变量地址相同,但同时,最后一行的输出也推翻了我推测的引用成员不会分配内存空间。该例中,如果引用类型成员不分配空间的话,那么sizeof(t)的结果应该为1,然而输出的结果为8。

于是,我又想起不知在那看到的引用的实现的是基于指针的,于是我又做了下面的测试:

linux32位环境下,结果如下:

x的地址:0xff82e66f
t.a的地址:0xff82e66f
4

该结果证明了,在c++类中:

1、引用成员的地址和其引用的变量地址相同;

2、对象的引用成员使用指针实现,并非不分配内存空间。(具体怎么实现的,我也不知道,以后知道了再说。)

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值