#pragma pack(n)对齐方式:
#pragma pack (n) //编译器将按照n个字节对齐。
#pragma pack () //取消自定义字节对齐方式。
在#pragma pack (n) 和#pragma pack ()之间的代码按n字节对齐。
#include<stdio.h> #pragma pack(show) #pragma pack(1) #pragma pack(show) typedef struct student { char a; //设置1个字节对齐,char 是1个字节,以1字节对齐,按1个字节处理 short b; //设置1个字节对齐,short 是2个字节,以1字节对齐,按2个字节处理 int c; //设置1个字节对齐,int 是4个字节,以1字节对齐,按4个字节处理 float d; //设置1个字节对齐,float 是4个字节,以1字节对齐,按4个字节处理 double e; //设置1个字节对齐,double 是8个字节,以1字节对齐,按8个字节处理 long f; //设置1个字节对齐,long 是4个字节,以1字节对齐,按4个字节处理 unsigned char g; //设置1个字节对齐,unsigned char 是1个字节,以1字节对齐,按1个字节处理 unsigned short h; //设置1个字节对齐,unsigned short 是2个字节,以1字节对齐,按2个字节处理 unsigned int i; //设置1个字节对齐,unsigned int 是4个字节,以1字节对齐,按4个字节处理 }student; #pragma pack(show) #pragma pack() #pragma pack(show) int main() { printf("%d",sizeof(student)); return 0; }
可以以一个字节对齐,因为一般的数据类型都是大于等于1个字节的。这样的话就会按照数据类型原有的的分配,就不会错位了。
这里有三点很重要:
1、每个成员分别按自己的方式对齐,并能最小化长度。
2、复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度。
3、对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐。
补充一下,对于数组,比如:char a[3];它的对齐方式和分别写 3 个 char 是一样的。也就是说它还是按 1 个字节对齐。
如果写 typedef char Array3[3];Array3 这种类型的对齐方式还是按 1个字节对齐,而不是按它的长度。
但是不论类型是什么,对齐的边界一定是 1,2,4,8,16,32,64....中的一个。
#pragma pack 的用法:
#pragma pack(n) //n=1,2,4,8,16 保存当前对齐方式,设置按 n 字节对齐
#pragma pack () //取消自定义字节对齐方式
#pragma pack(show) //显示当前内存对齐的字节数
#pragma pack(push) //保存当前对其方式到 packing stack
#pragma pack(push,n) //是指把原来对齐方式设置压栈,并设新的对齐方式设置为1个字节对齐
#pragma pack(pop) //packing stack 出栈,并将对其方式设置为出栈的对齐方式
#pragma pack(push) //保存当前对其方式到 packing stack
#pragma pack(push,n) //是指把原来对齐方式设置压栈,并设新的对齐方式设置为1个字节对齐
#pragma pack(pop) //packing stack 出栈,并将对其方式设置为出栈的对齐方式