为了保证计算机读取数据的高效性,编译器通常在结构体的成员数据进行内存对齐,使每一个成员变量都对齐在自然边界上,同时也有一定的空间牺牲。
我们重点考虑成员变量是如何对齐的:
对齐规则(偏移规则)
- 每个成员按照其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(未指定时采用默认值,32位系统通常默认按4字节对齐)中的较小的一个对齐,即min(n,sizeof(type))
- 结构长度必须为所有使用过的对齐参数中最大对齐参数的整数倍
#pragma pack()改变默认对齐
但是存在有些编译器的默认对齐方式不同,为了保证一致性,我们可以在编
写时采用#pragma pack()来指定对齐参数
用法:
#pragma pack(n)
//c struct code
#pragma pack()
上面中的c tsruct code段的代码将会以n为指定对齐参数,
实例理解
通过例子理解一下:
/*
64位系统,long所占字节为8
*/
#include <stdio.h>
#include <stdlib.h>
//#pragma pack(4)
struct A
{
int a1;
char a2;
int a3;
long a4;
char a5;
};
int main()
{
struct