#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++中地址相减和数值相减的区别如下,地址加一加的是指向变量的大小,