Q: 2.12 为何编译器在结构型变量中留下空洞,浪费空间并妨碍二进制读写外部数据文件?我能把它关闭或者控制结构成员对齐吗?


A: 许多机器访问内存中的数据,当这些数据适当对齐时可更有效。(例如,在一个字节寻址的机器上,2字节大小的short int放在偶数地址最佳,4字节的的long int的地址是4的倍数最佳。)一些机器根本不能访问未对齐的数据,并会要求所有数据都是适当对齐的。

因此,如果你声明一个这样的结构

  struct {
    char c;
    int i;
  };
编译器通常会留下一个未命名,未使用的空位,在char和int成员之间,以保证int成员被适当对齐了。(根据地一个成员为第二个成员增加的对齐,依赖于的事实是结构型对象本身总是按照最保守的对齐要求,经过适当地对其的。编译器保证这种它所分配的结构型对象的对齐,就像malloc那样。)

你的编译器可能提供了扩展让你能控制结构型对象填充(例如它们是否是填充了的),或许通过#pragma指令(参考问答11.20),但是没有标准的方法。

如果你担心会浪费空间,你能够把填充的效果最小化,通过根据它们的基本类型排序结构型对象成员,从最大到最小。你有时能通过位域(bit-field)在尺寸和对齐上获得更多控制,尽管它们有其自身的缺点。(参考问答2.26。)

参考问答2.13,16.7和20.5

补充链接 更多关于对齐的解释

参考:K&R2 Sec. 6.4 p. 138 H&S Sec. 5.6.4 p. 135


(This Chinese translation isn't confirmed by the author, and it isn't for profits.)

Translator : jhlicc@gmai1.c0m
Origin : http://www.c-faq.com/struct/padding.html