Chinaunix首页 | 论坛 | 博客
  • 博客访问: 99026
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 200
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-11 22:44
个人简介

HUST16届准毕业生,发奋求职中...

文章分类

全部博文(21)

文章存档

2015年(17)

2014年(4)

我的朋友

分类: C/C++

2015-04-09 14:18:26

     我自己也做了一个很小的测试,定义了两个结构体,对结构体进行sizeof输出所占空间的大小.

运行结果如下图:


char占1个字节,short占2个字节,double占8个字节。

在系统默认的情况下,结构体会进行对齐,对齐的原则如下:

 原则Astruct或者union的成员,第一个成员在偏移0的位置,之后的每个成员的起始位置必须是当前成员大小的整数倍;

 原则B:如果结构体A含有结构体成员B,那么B的起始位置必须是B中最大元素大小整数倍地址;

原则C:结构体的总大小,必须是内部最大成员的整数倍;

 

   因而,对test1而眼,x1是char型,偏移量为0,x2是short型,起始位置应该是2,故在x1和x2之间就会有一个空的字节,而x3是double,所以它的起始位置是8,因而x2和x3之间就会有4个空字节,最后x4是char,占据一个字节,而结构体的总大小是最大成员的整数倍,则char之后会填充7个空字节。最后共占用24个字节

而对于test2,x1和x2都是char ,所以它们其实位置分别是0和1,x4是short,所以起始位置是2,而x3是double,起始位置是8,所以x4和x3之间就会存在4个空字节,最后共占用16个字节。

那么如何修改这种默认分配策略呢?

可以使用伪指令#pragma pack(n)

当n=1时,看下输出的结果:


结果如下:

都是12,当加上#pragma pack(n)时,以上的原则A和原则C将不再生效。

 

那么编译器为什么要采取结构体对齐的方式呢?

这其实是计算机在时间和空间上的一个权衡,对齐的形式更加有利于计算机进行快速的处理,在可接受的空间浪费的前提下,对齐使计算机处理需要的的时间尽可能的少。 而我们在设计结构体的时候也一定要考虑结构体的对齐,因为不当的顺序会消耗大量的额外内存。

阅读(3798) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~