欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C/C++--->结构体内存对齐详解

程序员文章站 2022-07-12 16:49:17
...
  • 对齐规则
    (1) 第一个成员在与结构体变量偏移为0的地址处.
    (2) 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
    对齐数:编译器默认的一个对齐数与该成员大小的较小值(vs中默认值为8,Linux中默认值为4)。
    (3) 结构体总大小为最大对齐数的整数倍。
    最大对齐数:结构体的每个成员变量都有一个对齐数(该类型的大小),取最大。
    (4) 如果嵌套了结构体的情况,嵌套的结构体对齐到自己成员最大对齐数的整数倍,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
#include <iostream>
using namespace std;
struct S1
{
	char c1;
	int i;
	char c2;//8
};
struct S2
{
	char c1;
	char c2;
	int i;//8
};
struct S3
{
	double d;
	char c;
	int i;//16
};
struct S4
{
	char c1;
	struct S3 s3;
	double d;//32
};
int main()
{
	cout << sizeof(struct S1) << endl;
	cout << sizeof(struct S2) << endl;
	cout << sizeof(struct S3) << endl;
	cout << sizeof(struct S4) << endl;
	system("pause");
}

C/C++--->结构体内存对齐详解上图结构体S1:char c1从0偏移开始,占一个字节;接下来存int i,由于1不是4的整数倍,所以向后偏移2,3都不是4的倍数,4是4的倍数,故i从4开始储存,占用4,5,6,7偏移;现在可用偏移为8偏移是1的整数倍,char c2存放于9偏移;9不是最大对齐数4的整数倍,向后偏移10,11都不是,12偏移是4的整数倍,故结构体S1的大小为12字节。

小结:

  1. 在使用结构体的时候,占用空间小的元素应集中在一起可以节省内存
  2. 结构体嵌套,最大对其数为这两个结构体中的最大对其数较大的那个