结构体强制对齐

 
#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 保存当前对齐方式,设置按 字节对齐
#pragma pack ()             //取消自定义字节对齐方式
#pragma pack(show)   //显示当前内存对齐的字节数
#pragma pack(push)      //保存当前对其方式到 packing stack
#pragma pack(push,n)   //是指把原来对齐方式设置压栈,并设新的对齐方式设置为1个字节对齐
#pragma pack(pop)        //packing stack 出栈,并将对其方式设置为出栈的对齐方式
 
原文地址:https://www.cnblogs.com/listxue/p/15515557.html