设为首页 加入收藏

TOP

C语言内存中结构体字节对齐(九)
2013-09-24 09:19:20 来源: 作者: 【 】 浏览:824
Tags:语言 内存 结构 字节

 

  所以从0x0000到0x0007共八字节存放的是struct C的变量。又struct C的自身对齐值为4,所以struct C的有效对齐值为2。

  又8%2=0,struct C只占用0x0000到0x0007的八个字节。所以sizeof(struct C)=8。

  如果把上面的#pragma pack(2)改为#pragma pack(4),那么我们可以得到结构的大小为12。

  */

  //再看下面这个例子

  //

  #pragma pack(8)

  struct S1

  {

  char a;

  long b;

  };

  struct S2 {

  char c;

  struct S1 d;

  long long e;

  };

  #pragma pack()

  sizeof(S2)结果为24.

  /*

  S1中:

  成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;

  成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8;

  S2 中:

  c和S1中的a一样,按1字节对齐,

  d 是个结构,它是8个字节,它按什么对齐呢 对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.

  成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e;

  长度为24,已经可以被8(成员e按8字节对齐)整除.一共使用了24个字节.

  a b

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

  c S1.a S1.b d

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

  */

  //再看下面这个例子

  //

  #pragma pack(8)

  struct S1

  {

  char a;

  long b;

  };

  struct S2 {

  char c;

  struct S1 d;

  long long e;

  };

  #pragma pack()

  sizeof(S2)结果为24.

  /*

  S1中:

  成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;

  成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8;

  S2 中:

  c和S1中的a一样,按1字节对齐,

  d 是个结构,它是8个字节,它按什么对齐呢 对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.

        

首页 上一页 6 7 8 9 10 11 12 下一页 尾页 9/13/13
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言实现服务器与客户端 下一篇c语言strcpy()用法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: