此篇文章以以linux环境进行说明
数据类型占用的内存大小(字节数)int:4 char:1 float:4 double:8 short:2
1、struct内存对齐
按结构体内长度最大的类型对齐(这里只是用sizeof测试内存占用大小, 真正在内存申请空间的时候, 一整段内存一定是以4为最小单位对齐的)
struct T
{
char a;
char b;
char c;
}; // sizeof(T) = 3
struct T
{
char a;
char b;
char c;
short d;
}// sizeof(T) = 6
若多个变量没有超过对齐边界, 则不需要补空,否则需要补空, 将超过边界的变量重新按对齐规则进行新的空间分配,示例如下:
struct T
{
short a; //2
char b; //1
char c; //1
//a,b,c 的字节总和刚好达到对齐, 所以不需要补空
int d; //4
}; //sizeof(T) = 8
struct T
{
char a; //1
char b; //1
char c; //1
// a+b+c=3, 虽然没有达到边界,但是需要对齐,所以需要一个补空白位
int d; //4
}; //sizeof(T) = 1(a)+1(b)+1(c)+1(补位)+4 = 8
利用pragma pack设定对齐的值
struct T
{
int a; //4
char b; //1
//补齐-3
double c; //8
char d; //1
//补齐-7
}; sizeof(T) = 24
#pragma pack(4)
struct T
{
int a; //4
char b; //1
//补齐-3
double c; //8
char d; //1
//因为强按4对齐, 补齐-3
}; sizeof(T)=20
思考:根据变量定义顺序, 先定义的先对齐, 遇到更长的再对齐, 还是一开始就按最长的对齐了
struct T
{
char a;
short b;
int c;
}//a,b,对齐,c ???
//a,对齐,b,c ???
不解释 了~~~