zoukankan      html  css  js  c++  java
  • 结构体内字节手动对齐(#pragam pack)

      在程序运行过程中,结构体或类的字节对齐可以使程序更方便、更快速的执行,除了编译器本身的优化外,还可以在程序中手动对齐。在C/C++中,是通过引入#pragam pack(n)来实现的。

      缺省情况下,编译器为每个结构体或类中的每个成员按其自然对界(natural alignment,自然对界是指按结构体或类的成员中size最大的成员对齐)条件分配空间。各个成员安装它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构或类的地址相同。

      #pragma pack(n)的使用规则为:结构体或类中的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照n和自然对齐长度中比较小的那个进行。即,当n的值等于或超过所有数据成员的长度时,这个n值将不会产生任何效果。详见实例解释其用法:

    (1)  #pragma pack(4)
        struct test {
          int a;      //第一个成员,放在[0,3]偏移的位置
          char b;   //第二个成员,自身长为1,和pack比较,取最小值,也就是1,所以这个按一个字节对齐,放在[4]偏移的位置
          short c;  //第三个成员,自身长为2,和pack比较,取最小值,也就是2,所以这个按两个字节最求,放在[6,7]偏移的位置
          char d;   //第四个成员,自身长为1,和pack比较,取最小值,也就是1,所以这个按一个字节对齐,放在[8]偏移的位置    
        };
      int nSize=sizeof(test);
          这个结构体实际占据内存9个字节,结构体或类之间的对齐,是按照类或结构体内部最大成员的长度和n值中较小的一个对齐的,这个例子中,结构体之间对齐的长度是min(n,sizeof(int)),也就是4,9按照4的整数倍为12,所以nSize=12.

    (2) #pragma pack(4)
        struct test {
          char b;   //第一个成员,自身长为1,和pack比较,取最小值,也就是1,所以这个按一个字节对齐,放在[0]偏移的位置
          short c;  //第二个成员,自身长为2,和pack比较,取最小值,也就是2,所以这个按两个字节最求,放在[2,3]偏移的位置
          char d;   //第三个成员,自身长为1,和pack比较,取最小值,也就是1,所以这个按一个字节对齐,放在[4]偏移的位置    
        };
      int nSize=sizeof(test);
          这个结构体实际占据内存5个字节,结构体之间对齐的长度是min(n,sizeof(short)),也就是2,5按照2的整数倍为6,所以nSize=6.

  • 相关阅读:
    matlab练习程序(径向模糊1)
    matlab练习程序(摄像头获取数据)
    jpg转bmp(使用libjpeg)
    matlab练习程序(图像放大/缩小,双线性插值)
    一维最大子数组
    二分查找
    图像处理时用的卷积函数
    matlab练习程序(摄像头视频中截图)
    bmp24位彩色图像转8位灰度图像(纯C++)
    C#中值类型、引用类型 再次理解
  • 原文地址:https://www.cnblogs.com/zhaolizhe/p/6945620.html
Copyright © 2011-2022 走看看