当前位置: 代码迷 >> 综合 >> C++:类占用的字节内存
  详细解决方案

C++:类占用的字节内存

热度:46   发布时间:2024-03-09 23:30:04.0

 

//验证 1.内存对齐
/*
#include<iostream>
using namespace std;class CBase
{int a;  //这里的内存对齐和struct对齐很像char p; //前面定义了一个int型变量,char q; //后面定义一个或两个char型的话,都是占用8字节
};int main()
{CBase class_1;cout << sizeof(class_1) << endl;    //输出8字节return 0;
}
*///验证 2.空类占1字节
/*
#include<iostream>
using namespace std;class A
{};int main()
{A class_1;cout << (void*)(&class_1) << endl;cout << sizeof(class_1) << endl;return 0;
}
/*
输出1字节
可以看到一个空类对象的大小1.
一个空类对象的大小是1,为什么不是0?
初学者肯定会很烦恼?类A明明是空类,它的大小应该为0,为什么编译器输出的结果为1呢?
这就是实例化的原因(空类同样被实例化),每个实例在内存中都有一个独一无二的地址,
为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,
这样空类在实例化后在内存中得到了独一无二的地址,所以class_1的大小是1.
*///验证 3.成员函数不占用类对象的内存空间
/*
#include<iostream>
using namespace std;class A
{
public:void func1() {};void func2() {};void func3() {};
};int main()
{A class_1;cout << sizeof(class_1) << endl;return 0;
}
/*
虽然我们给类A添加了三个成员函数,但这里输出依然是1字节
说明成员函数不占用类对象的存储空间
*///验证 4.成员变量占用类对象的内存空间
/*
#include<iostream>
using namespace std;class A
{
public:void func1() {};void func2() {};void func3() {};char a;
};int main()
{A class_1;cout << (void*)(&class_1) << endl;  //查看class_1的地址cout << sizeof(class_1) << endl;    //依然是占用1字节class_1.a = 'c';return 0;
}
/*
这里输出仍然是1字节
没有char成员变量的时候,编译器往往会给一个空类隐含的加一个字节
有了一个字节的char型成员变量的话,编译器就不会给类加字节了
但char还是占一个字节,不知道你能不能看明白
*///验证 5.int型成员变量占4字节
/*
#include<iostream>
using namespace std;class A
{
public:void func1() {};void func2() {};void func3() {};int a;
};int main()
{A class_1;cout << (void*)(&class_1) << endl;  //查看class_1的地址cout << sizeof(class_1) << endl;    //这时就占用4字节class_1.a = 12;return 0;
}
*/

 

  相关解决方案