做题的时候发现一个题目求类的sizeof()大小,复制了网友的解答:
#pragma pack(2)
class BU
{
int number; // 4
union UBffer
{
char buffer[13]; // 13
int number; // 4
}ubuf; // union的大小取决于它所有的成员中,占用空间最大的一个成员的大小,并且需要内存对齐,这里因为#pragma pack(2),所以union的大小为14,如果不写#pragma pack(2),那么union大小为16【因为与sizeof(int)=4对齐】
void foo(){} //0
typedef char*(*f)(void*); //0
enum{hdd,ssd,blueray}disk; // 4
}bu;
因此sizeof(union) = 4+14 +0 +0 +4 = 22
类的大小计算的时候,只包括:
- 类的非静态成员数据的类型大小之和.
- 如果有虚函数的话,还要加上指向虚函数的指针(vptr)大小
- 边缘调整后的大小
- 与类中的构造函数,析构函数以及其他的成员函数无关.
据说,类的成员是类的所有对象共享的,放在程序的代码区,这部分区域sizeof()是不计算的。
- 代码区存储程序的代码
- 数据区存放全局变量和静态变量,与常量 其实可以细化为全局/静态数据区与常量数据区
- 栈中存放局部变量与传来的参数
- 堆是动态分配使用的