在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上对齐 最坏情况边界“。我已多次读取文本,但仍然不明白为什么对齐需要很长时间.SIZE是一个int,PTR是4个字节,所以它不应该对齐吗?为什么要使用long,和不是int?谢谢。
答案 0 :(得分:7)
正如@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
的并集会强制编译器将结构放在4字节边界上,否则它可以放在2字节边界上。