【C++】结构体内存对齐详解
https://blog.csdn.net/qq_28087491/article/details/127441796
文章里有小错误,32位机默认应该是8字节。
字节对齐规则
结构体中各个成员按照它们被声明的顺序在内存中顺序存储。对齐规则如下:
1 各个数据成员按各自数据类型对齐:
对齐模数是该数据成员所占内存与#pragma pack指定的数值中的较小者。
2 整个结构体字节大小向结构体模数对齐:
结构体模数 是 #pragma pack指定的数值(32位机默认8字节、64位机默认16字节) 和 结构体内部最大的基本数据类型成员 长度中数值较小者。结构体的长度应该是该模数的整数倍。
======================
简单地说就是每个成员的位置,就看自己和指定数值比小,取倍数。(如果是成员也是个结构体,则看该结构体内的最大成员大小)
整个结构体大小,就看最大成员和指定数值比小,取倍数。
======================
例如:
#include <iostream>
#include <stddef.h>
#include <stdio.h>
#pragma pack(show) //x86下8字节; x64下16字节
struct A {
int a1;
double a2;
int a3;
bool a4;
};
struct B {
int b1;
A b2;
double b3;
int b4;
};
int main() {
printf("%zu\n", offsetof(A, a1));//0
printf("%zu\n", offsetof(A, a2));//8
printf("%zu\n", offsetof(A, a3));//16
printf("%zu\n", offsetof(A, a4));//20
printf("%zu\n", sizeof(A));//24 大小必须是8的倍数,也就是a2的8字节和默认16字节取小得到的
printf("===========\n");
printf("%zu\n", offsetof(B, b1));//0
printf("%zu\n", offsetof(B, b2));//8 注意这个偏移量8,是用A::a2和默认16字节取小得到的
printf("%zu\n", offsetof(B, b3));//32
printf("%zu\n", offsetof(B, b4));//40
printf("%zu\n", sizeof(B));//48
}
Categories: IT