C_and_CPP 版 (精华区)

发信人: seaboy (浪小), 信区: C_and_CPP
标  题: [FAQ]什么是对齐  (转)
发信站: 哈工大紫丁香 (2003年08月27日10:18:50 星期三), 站内信件


对齐有很多, 
结构对齐,栈对齐, 
变量地址对齐。 
内存分配对齐。 
一般的gcc兼容的对齐大致是这样的, 

变量地址对齐, 
所有具有静态储存类型的变量按照缺省对齐。 
栈对齐按照给编译器传的参数,这是指的变量地址要对齐。 
要改编一个静态储存类型的对齐方式, 
用 __attribute__((aligned(xxx)))指定。 
这个gcc扩展不但gcc支持, 
其他很多编译器也支持。 

结构对齐,是指结构内部布局和最后sizeof的对齐。 
内部布局对齐一般原则是符合该类型的对齐 
例如一个64位的RISC机器 
struct A { 
  char x; 
  struct B b; 
  char y; 
  char z; 
  long xx; 
}; 
如果 struct B的对齐是16. 
那么最后整个struct A的sizeof就按照16对齐, 
如果小于sizeof(long) 
就按sizeof(long)对齐。 
如此递归往外。 
内部偏移, 
b被放到了b的对齐量的偏移量上, 
如果b的对齐是16 
那么b的偏移就是16. 
接下来y因为b的sizeof是对齐的, 
所以就是对齐的。 
但z就不一定对齐,因为char这个基本类型不需要对齐。 
再接下来xx又是按8对齐了。 

对struct的sizeof可以用__attribute__(packed(xxx)))来缩小对齐。 
用__attribute__(aligned(xxx)))来增大对齐。 

还有一些其他的对齐方面的问题,这里就不说了。 



--
才知道   
原来
自己需要的是   
100万
份勇气。。。

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.239.104]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.966毫秒