1 为什么要进行内存对齐?
①不是所有的硬件平台都能访问任意地址上的任意数据的。
②为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。(即以空间换时间)
2 内存对齐的规则
2.1 应用对象
联合体和结构体
2.2 规则
2.2.1 概念
①数据类型自身的对齐值:64位系统(windows 和 Linux)下char、short、int、float、double自身对齐值分别是1、2、4、4、8字节。
②结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。(如是数组只考虑变量类型)。
③指定对齐值:#pragma pack (value)时的指定对齐值value。没有指定为默认,Ubuntu 64位系统下为8。
③数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值
2.2.2 要求
对齐指的是:每个成员相对于这个结构体的偏移量是该成员类型有效对齐值的整数倍;结构体占用的字节数是其有效对齐值的整数倍。
3 具体判断方法
#include <stdio.h>
typedef union
{
short i;
int k[5];
char c[3];
}Mat;
typedef struct
{
int i;
Mat j;
double k;
}Like;
void main(void)
{
printf("%ld\r\n", sizeof(Mat)+sizeof(Like));
}
①联合体大小Mat为自身最大数据大小,即20,且20/4=5(4为有效对齐值),满足联合体大小原则。
②结构体Like的大小为:i占4个字节,未补齐时j变量的偏移值为4,4(偏移值)/4(有效对齐值)=1,能整除,所以不用补齐。Mat的大小为20个字节。未补齐时k变量的偏移值为24,24/8=3,所以不用补齐。所以整体大小为4+20+8=32个字节。32/8=4,满足结构体大小原则。
③两者相加的大小为32+20=52个字节。