• 结构体强制对齐


     
    #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 出栈,并将对其方式设置为出栈的对齐方式
     
  • 相关阅读:
    C#调试信息打印到输出窗口
    C#拼接SQL中in条件
    从图像到知识:深度神经网络实现图像理解的原理解析
    Cocoa Touch(六):App运行机制 NSRunLoop, KVC, KVO, Notification, ARC
    Cocoa Touch(五):网络请求 NSURLSession/AFNetworking, GCD, NSURLResquest
    JQuery:选择器、动画、AJAX请求
    Cocoa Touch(四): 多线程GCD, NSObject, NSThread, NSOperationQueue
    Socket、RPC通信实例,简单版本,仅供查阅
    Cocoa Touch(三):图形界面UIKit、Core Animation、Core Graphics
    Cocoa Touch(二):数据存储CoreData, NSKeyArchiver, NSOutputStream, NSUserDefaults
  • 原文地址:https://www.cnblogs.com/listxue/p/15515557.html
Copyright © 2020-2023  润新知