内存对齐
内存对齐为了解决什么问题?
CPU取地址并不是一个字节一个字节的取。
是一次性取多个字节。如果一个变量放在两个CPU取的块中,那么就会造成多一次的读取。
变量所占的字节数
64位的系统中
bool char 1字节
int 4字节
指针8字节
short 2字节
内存对齐的要求
每个变量的偏移地址为字节数的倍数。
如下所示b为1字节,a为4字节,但是a如果紧接在b的后面偏移地址为1.
所以b后面得添加3个字节,变成4字节。4+4=8。
struct mystruct
{
bool b;
int a;
}
结构体中有函数的情况:
本以为是多个虚函数都只有一个指针指向虚函数列表,非虚函数则有多少个就有多少个8字节。
但是经过实验使用sizeof()发现,不管怎么样增加非虚函数,都没有内存空间大小的增加。仔细想想后得出下面的结论:
首先函数的存储是不在对象里面的,而是多个对象共享的。因此非虚函数在对象中不存在。
如果有虚函数,考虑到每个类有一个虚函数指针指向虚函数列表。
所以会有一个8字节的空间,无论多少个虚函数都是8字节。
因此下面占用的空间数是4+4+8
struct mystruct
{
bool b;
int a;
int func(int c){};
void* func3(int d) {};
virtual void func1(){};
virtual void func2() {};
};