1. 空类大小
空类: 空类占用1个字节
#include <iostream>
#include <memory.h>
using namespace std;
class A1
{
};
class A2
{
};
class B: public A1
{
};
class C: virtual B
{
};
class D: public A1, A2
{
};
int main(int args, char *argv[])
{
cout << "sizeof (A1): " << sizeof (A1) << endl;
cout << "sizeof (B): " << sizeof(B) << endl;
cout << "sizeof (C): " << sizeof(C) << endl;
cout << "sizeof (D): " << sizeof(D) << endl;
return 0;
}
运行的答案是:
sizeof (A1): 1
sizeof (B): 1
sizeof (C): 4
sizeof (D): 1
** 这说明了空类所占用的空间为1, 单一继承的空类占用的空间也是1, 多重继承的空类所占用的空间也是1 ,但是虚继承涉及到了虚表(虚指针),所以sizeof(C)是4**
2. 类中变量的内存对齐
#include<iostream>
using namespace std;
class A
{
A();
~A();
char c;
float b;
int arr[3];
};
int main()
{
cout << "sizeof(A): " << sizeof(A) << endl;
return 0;
}
** 计算的大小是: **
sizeof (A): 20
float 占4个字节, 插入占1个字节, int arr[3] 占12个字节, 总共占了17个字节,根据内存对齐原则,要选择4的倍数, 所以是20
内存对齐的四条规则:
数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节, 则要从4的整数倍地址开始存储),基本类型不包括struct/class/uinon。
结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部"最宽基本类型成员"的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)。
收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的"最宽基本类型成员"的整数倍.不足的要补齐.(基本类型不包括struct/class/uinon)。
sizeof(union),以结构里面size最大元素为union的size,因为在某一时刻,union只有一个成员真正存储于该地址。
举个例子:
#include <iostream>
using namespace std;
class A
{
public:
char a;
int b;
char c;
};
class B
{
public:
char a;
char b;
int c;
};
int main(int args, char* argv[])
{
cout << "sizeof(A) : " << sizeof(A) << endl;
cout << "sizeof(B) : " << sizeof(B) << endl;
return 0;
}
输出结果是:
sizeof(A):12
sizeof(B):8