【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

Comments