我先给几个列子以便理解对齐方式:
(1)三个一个byte的char类型一个8byte的int类型
typedef struct {
char ch;
char sh;
char ds;
DWORD64 dw;
}Test;
//获取地址
Test t;
int ss = sizeof(t);
auto* p1 = &(t.ch);
auto* p2 = &(t.sh);
auto* p3 = &(t.ds);
auto* p4 = &(t.dw);
获取到地址如下:
可以看到三个char一次按顺序排列,8byte单独一行,以最大的int64为行的长度,长度为16byte。
此时占据16个字节总共。
(2)我将其中一个char换到最后
typedef struct {
char ch;
char sh;
DWORD64 dw;
char ds;
}Test;
//获取地址
Test t;
int ss = sizeof(t);
auto* p1 = &(t.ch);
auto* p2 = &(t.sh);
auto* p3 = &(t.ds);
auto* p4 = &(t.dw);
获取到地址如下:
可以看出排列方式char1、char2单独一行,int64一行,char3一行,以最大的int64为行的长度如下,长度为24byte:
(3)增减一个short类型
typedef struct {
char ca;
char cb;
short sa;
DWORD64 ia;
char cc;
}Test;
排列如下,长度为24byte:
(4)增减一个int类型在char2与short之间
typedef struct {
char ca;
char cb;
int ia;
short sa;
DWORD64 da;
char cc;
}Test;
排列方式如下,总共占32字节:
(5)将short放到int前
typedef struct {
char ca;
char cb;
short sa;
int ia;
DWORD64 da;
char cc;
}Test;
排列方式如下,占24字节:
总结:结构体中元素按照定义顺序依次置于内存中,但并不是紧密排列。从结构体首地址开始依次将元素放入内存时,元素会被放置在其自身大小的整数倍偏移量地址上,开始偏移量以0开始。