#pragma pack()默认对齐方式

简介:

一般的pack对齐格式分别是1,2,4,8,16.

默认的对齐格式,也就是:#pragma pack()

情况下,会在结构体中挑选占用字节最多的类型,例如double 占用8个字节,例子:

#pragma pack()

struct A
{
    char c;

    char c1;

    int a;

    double d;

};

上面的结构体长度是16.为什么是16,而不是char 8 int 8 double 8

实际上,当我们采用默认的对齐,决定存储的长度是8个字节,所以每8个字节为一组,存放数据,但是可能像上面的情况是一个字节的字符,占用了1个字节的存储空间,编译器尝试利用剩余的7个空,避免读取寄存器数值 的时候,从奇数的位置开始读取数据。所以跳过了一个1个字节。发现下一个元素刚好可以填充从第3个字节开始的位置,所以填充。现在位置移动到了第5个字节,还剩下4个字节,这一组就分配完毕了,此时遇到了一个整型,刚刚好。

如果指定了字节对齐的个数,情况就会不一样:

#pragma pack(1)

struct A
{
    char c;

    char c1;

    int a;

    double d;

};

变成了14个字节。

 

总结如下:如果没有指定字节对齐,挑选字节长度最长的类型作为对齐的字节数。然后分配对齐字节数的空间,尝试将结构体的成员,往里面塞,注意存在的开始地址必须是偶数。

 





     本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1591664,如需转载请自行联系原作者



相关文章
|
11月前
Cocos Creator3.8 项目实战(三)去除scrollview背景色和label 对齐方式设置无效问题解决
Cocos Creator3.8 项目实战(三)去除scrollview背景色和label 对齐方式设置无效问题解决
119 0
|
11月前
|
API CDN
SAP UI5 compatible version 字段的作用和框架解析该值的位置
SAP UI5 compatible version 字段的作用和框架解析该值的位置
|
存储 编译器
#Pragma Pack(n)内存分配
#Pragma Pack主要是用在字节对齐方面,为什么要对齐呢? 因为计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。
132 0
#Pragma Pack(n)内存分配
justify-content: space-between能够对齐的解决办法
justify-content: space-between能够对齐的解决办法
|
JavaScript
SAP Spartacus cx-page-layout 属性运行时的赋值原理, set 是如何被框架调用的?
SAP Spartacus cx-page-layout 属性运行时的赋值原理, set 是如何被框架调用的?
SAP Spartacus cx-page-layout 属性运行时的赋值原理, set 是如何被框架调用的?