zoukankan      html  css  js  c++  java
  • 结构体强制对齐

     
    #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 出栈,并将对其方式设置为出栈的对齐方式
     
  • 相关阅读:
    2019-2020-1 20199304《Linux内核原理与分析》第四周作业
    2019-2020-1 20199304《Linux内核原理与分析》第三周作业
    第二周测试
    2019-2020-1 20199304《Linux内核原理与分析》第二周作业
    2019-2020-1 20199304《Linux内核原理与分析》第一周作业
    2019-2020-1 20199310《Linux内核原理与分析》第六周作业
    2019-2020-1 20199310《Linux内核原理与分析》第五周作业
    2019-2020-1 20199310《Linux内核原理与分析》第四周作业
    2019-2020-1 20199310《Linux内核原理与分析》第三周作业
    2019-2020-1 20199310《Linux内核原理与分析》第二周作业
  • 原文地址:https://www.cnblogs.com/listxue/p/15515557.html
Copyright © 2011-2022 走看看