引言:
在网上找内存对齐的文章,说的太抽像了,于是自己写了测试用例得出了一下的结论。我均在vs里面测试过了。
建议先看例子,再来看文字叙述,可以先看示例三的内存图示
做法:找到类内部内存占用最大的作为每一次申请的大小,比如类内部最大为double 那么应该以8为单位申请,
具体做法:
内存对齐可以想象为预先给到你这么多的内存空间,即使你用不到。下一次有属性的添加时看看是否内存超限,超限就再次申请整数倍的内存。
申请的内存数按照最大的一次一次申请,每次申请的都是最大的整数倍,如果内存没有超出,就不用申请。但是此时要注意如果在以8为单位申请时内部有4和1相邻的时候要按照4来申请,具体的看示例2,同理可得16内部申请8...等来套娃
简单示例
char b;//8
int c;//8
char j;//16
double a;//24
看懂就可以划走了
下图均为在class 里面定义,class就不写了,关键看过程
//示例1 最大的内存为4
int a;
char b;
//此时为8个字节 但是后三个字节没有写入内容
int c;
//此时为12 因为5+4=9超出了之前分配好的内存8
char d;
//此时为16
char e;
//此时为16 因为之前的为12+1有效内存在13处,现在应该在14处,没有超出预先分配好的内存
char f ;//15
//16
char g; //16
//16
char j;
//此时为20,因为这里应该为17超出16,那么这里应该分配int大小
...
//示例2
现在换一下,结果如下,最大的内存为8
double a;//8
char b;//16
int c;//16
//看这里,到这里时候就说明了在8内部申请以4个单位来对齐
char d;//24
char e;//24
char f;//24
char g;//24
char j;//24
int h;//32
char i;//32
char o;//32
int l;//40
//示例三 最大的还是为8不管定义在哪个位置
现在把double a定义在最后面,类的内存分布见图
char b;//8
int c;//8
char d;//16
char e;//16
char f;//16
char g;//16
char j;//16
int h;//24
char i;//24
char o;//24
int l;//32
double a;//40
示例三的图示见最后
示例三的内存图示如下: