测试空类对象大小为一

#include <iostream>

using namespace std;

class V
{
};

int main()
{
	cout << "空类大小:"<<sizeof(V) << endl;

	V v1, v2;
	cout << "空类v1分配内存地址:" << &v1 << endl;
	cout << "空类v2分配内存地址:" << &v2 << endl;
	cout << "连续分配的两个空类对象内存地址差值:" << (long)&v2 - (long)&v1 <<endl;
	cout << endl;

	char ch1='a', ch2='b';
	cout << &ch1 << endl;
	cout << &ch2 << endl;
	cout << "字符ch1分配内存地址:" << (void*)&ch1 << endl;
	cout << "字符ch1分配内存地址:" << (void*)&ch2 << endl;
	cout << "连续分配的两个char内存地址差值:" << (long)&ch2 - (long)&ch1 << endl;
	cout << endl;

	int in1=1, in2=5;
	cout << &in1 << endl;
	cout << &in2 << endl;
	cout << "不加long强转:"<<&in2 - &in1 << endl;
	cout << "加long强转:" << (long)&in2- (long)&in1 << endl;
	return 0;
}

 Debug下输出结果

Release下输出结果

现象:

1、由Debug得出的连续独立变量的地址差值不等于实际的变量所占内存,原因是这里采用Debug ,Debug 是“调试”的意思,编译器在生成 Debug 版本的程序时会加入调试辅助信息,这些调试信息会在变量前后占有内存,而Realse得出的发行版本的代码,优化后不存在调试信息,所以连续独立变量的地址差值等于实际的变量所占内存

2、由Debug可知连续的两个空类对象内存地址差值为12,和两个连续的char内存地址的差值12一样,由Realse看更为明显,两个空类对象内存地址差值为1,所以说sizeof(一个空类对象)=1,原因就是空类是可以实例化的,那么实例化的对象必须要占有一定的内存,不然无法使用这些实例,占有多大内存,由编译器决定,在VS编译器,每一个空类实例占用一个字节内存

3、输出&char为一串乱码,原因是&char为char*,cout重载函数对char*处理意味着将地址指向的字符串输出(以‘\0’结束),而不是输出地址,所以在结果中我们可以看到输出了原有的a还有一串乱码,故而输出char的地址,需要强转为void*

4、c++中地址相减和数值相减的区别如下,地址加一加的是指向变量的大小,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值