pack详解

原创 2005年02月26日 18:33:00

#pragma pack(8)

struct S1{

    char a;

    long b;

};

struct S2 {

    char c;

    struct S1 d;

    long long e;

};

#pragma pack()

sizeof(S2)结果为24.

成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐.

也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节.

S1,成员a1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a1字节对齐;成员b4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8;

S2,cS1中的a一样,1字节对齐,d 是个结构,它是8个字节,它按什么对齐呢?对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e8字节对齐)整除.这样,一共使用了24个字节.

              a    b

S1的内存布局:11**,1111,

              c    S1.a S1.b     d

S2的内存布局:1***,11**,1111,****11111111

 

这里有三点很重要:

1.每个成员分别按自己的方式对齐,并能最小化长度

2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度

3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

#pragma pack 用法详解

#pragma pack 用法详解 pack 为 struct, union和 class等的成员对齐指定字节边界.与编译选项(属性 ->配置属性 -> C/C++ ->代码生成 ->结...

#pragma pack 用法详解

pack 为 struct, union 和 class 等的成员对齐指定字节边界. 与编译选项(属性 -> 配置属性 -> C/C++ ->代码生成 -> 结构成员对齐)的 /Zp 开关不同, 它不...

#pragma pack 用法详解

pack 为 struct, union 和 class 等的成员对齐指定字节边界. 与编译选项(属性 -> 配置属性 -> C/C++ ->代码生成 -> 结构成员对齐)的 /Zp 开关不同, 它不...

php pack()函数详解与示例

pack和unpack在一般的程序中还真的不容易见到,但是如果你用过很久以前的php生成excel你就会知道了。他的excel的头就是pack出来的 最近在尝试与C交互的时候又用上了这玩意,所以不得...

#pragma pack 用法详解

1. #pragma pack(show) 以警告信息的形式显示当前字节对齐的值. 2. #pragma pack(n) 将当前字节对齐值设为 n . 3. #pragma pack() 将当前字节对...

#pragma pack(n) 对齐用法详解 (转载)

什么是对齐,以及为什么要对齐: 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需...

#pragma pack详解

一、n字节的对齐方式VC对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。   VC中提供了#pragma p...

#pragma pack(n) 对齐用法详解

什么是对齐,以及为什么要对齐: 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的 内存地址访问,这就...

(转载)#pragma pack 用法详解

pack 为 struct, union 和 class 等的成员对齐指定字节边界. 与编译选项(属性 -> 配置属性 -> C/C++ ->代码生成 -> 结构成员对齐)的 /Zp 开关不同, 它不...

详解c语言字节对齐,pragma pack指令详细说明,打包票绝对详尽

【转】转帖:typedef __PACKED struct字节对齐详解 关键字:#pragma pack  typedef __PACKED struct  结构 字节  对齐 一...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)