[英]C alignment in union
在K&R C编程代码中,给出了以下代码
typedef long Align; /* for alignment to long boundary */
union header { /* block header: */
struct {
union header *ptr; /* next block if on free list */
unsigned size; /* size of this block */
} s;
Align x; /* force alignment of blocks */
};
typedef union header Header;
然后它继续说“从未使用Align字段;它只是强制每个标题在最坏情况边界上对齐”。 我已多次阅读该文本但仍不明白为什么需要长时间进行对齐。 SIZE是一个int,PTR是4个字节,所以它不应该对齐吗? 为什么要使用long,而不是int? 谢谢。
那是一本非常古老的书。 当时许多机器上的指针只有16位,而长为32位,因此联合强制对齐为32位。
正如@Deduplicator指出的那样,仍有许多嵌入式系统使用16位指针。
编辑以回应评论:对齐的主题相当广泛且充满细微差别。 为了简单起见,下面的讨论做出了这些假设
int
是16位 long
是32位 以下结构将占用32位
struct header {
struct header *ptr;
unsigned size;
};
但是,结构中的字段仍然是16位。 因此,对齐要求仍然只有16位。 因此,例如,将结构放置在地址0xAA02将完全有效,因为ptr
将位于对齐的地址(0xAA02),并且size
也将位于对齐的地址(0xAA04)。
但是,地址0xAA02没有为并集适当地对齐,因为并集的x
字段需要32位对齐。 因此,将结构放入与x
的并x
强制编译器将结构放在4字节边界上,否则它可以放在2字节边界上。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.