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阻止编译器警告

在xcode6中,如果使用类似以下代码传入nil,会被xcode提示错误 [dataImage setData:nil]; 编译器提示:Null passed to a callee tha...
  • u010795305
  • u010795305
  • 2015年12月17日 10:03
  • 1772

#pragma pack(结构体对齐的具体含义) 和#pragma once与 #ifndef的区别

朋友帖了如下一段代码:   #pragma pack(4)   class TestB   {   public:     int aa;     char a;     short b;     c...
  • zhrh0096
  • zhrh0096
  • 2013年05月11日 18:22
  • 728

记录#pragma pack()的问题

在Cortex M0平台上做开发的时候,遇到一个纠结了两三天的问题。 代码添加了PWM马达控制后,继续做USB复合设备。在做好USB复合设备,发现原来的PWM马达控制不起作用了,首先对比了模块的寄存...
  • dndxhej
  • dndxhej
  • 2014年01月28日 17:56
  • 8843

pragma pack字节对齐详解

强调一点: #pragma pack(4) typedef struct {     char buf[3];     word a; }kk; #pragma pack() 对齐的原则是min(si...
  • yangyangye
  • yangyangye
  • 2014年12月24日 17:36
  • 1537

一个对齐关键字pack引起的副作用

今天遇到一个很典型的因为没有留意pack关键字有效范围而引起的程序bug,觉得很有意思,就记录下来。 现象如下:声明了一个数据结构 struct st_data,这个数据结构中有一个成员是一个函数指...
  • ricepot100
  • ricepot100
  • 2016年12月23日 22:05
  • 432

C语言之#pragma pack或者__packed学习

C语言之#pragma pack学习 转自:http://www.cppblog.com/range/archive/2011/07/15/151094.html #pragma pack学...
  • xlhcgd
  • xlhcgd
  • 2015年05月28日 11:47
  • 1156

C语言的字节对齐 #pragma pack(n)2

#pragma pack(n) 解释一: 每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系...
  • yusiguyuan
  • yusiguyuan
  • 2015年03月23日 15:10
  • 1999

pragma pack(非常有用的字节对齐用法说明)

声明: 整理自网络达人们的帖子,部分参照MSDN。 强调一点: #pragma pack(4) typedef struct {     char bu...
  • hellokandy
  • hellokandy
  • 2016年12月23日 09:50
  • 959

#pragma pack(1) 单身狗,自己挖坑自己踩

一些头文件里涉及网络传输的结构体被pack(1),pack()包裹的,然而有部分我新增的功能是从原有代码复制改写的,有一处只有pack,前面没有对应的pack(1),这倒问题不大,另一处是只有pack...
  • Bill_Xiang
  • Bill_Xiang
  • 2017年03月13日 22:44
  • 703

php pack()函数详解与示例

转自:http://www.neatstudio.com/show-2327-1.shtml pack和unpack在一般的程序中还真的不容易见到,但是如果你用过很久以前的php生成exce...
  • qdujunjie
  • qdujunjie
  • 2014年11月07日 11:36
  • 920
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:pack详解
举报原因:
原因补充:

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