内存对齐和alignof,alignas
内存对齐的原因:
- 某些硬件平台不支持对未对齐对象的访问
- 对齐后,访问效率更高
内存对齐要求:
- 任何K字节的基本对象的地址必须是K的倍数。
为了实现这个要求,结构体中会有一些填充字节,即padding;另外,结构体的末尾可能也需要一些填充,这样结构体数组中的每个结构体元素都会满足对齐要求,即alignment。
举例说明:
struct S1 {
int i; // size: 4
char c; // size: 1
// 3 bytes padding
int j; // size: 4
}; // size: 12, alignment: 4
struct S2 {
int i; // size: 4
char c; // size: 1
char d; // size: 1
// 2 bytes padding
long j; // size: 8
}; // size: 16, alignment: 8
struct S3 {
int i; // size: 4
int j; // size: 4
char c; // size: 1
// 3 bytes padding
}; // size: 12, alignment: 4
struct S4 {
short w[5];