联合中的C对齐
在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字段;它只是强制每个标题在a上对齐 解决方法
那是一本非常古老的书.当时许多机器上的指针只有16位,而长为32位,因此联合强制对齐为32位.
正如@Deduplicator指出的那样,仍有许多嵌入式系统使用16位指针. 编辑以回应评论:对齐的主题相当广泛且充满细微差别.为了简单起见,下面的讨论做出了这些假设 >指针是16位 以下结构将占用32位 struct header { struct header *ptr; unsigned size; }; 但是,结构中的字段仍然是16位.因此,对齐要求仍然只有16位.因此,例如,将结构放置在地址0xAA02将完全有效,因为ptr将位于对齐的地址(0xAA02),并且大小也将位于对齐的地址(0xAA04). 但是,地址0xAA02没有为并集适当地对齐,因为并集的x字段需要32位对齐.因此,将结构放入与x的并集会强制编译器将结构放在4字节边界上,否则它可以放在2字节边界上. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |