繁体   English   中英

联合中的C对齐

[英]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位指针。


编辑以回应评论:对齐的主题相当广泛且充满细微差别。 为了简单起见,下面的讨论做出了这些假设

  • 指针是16位
  • int是16位
  • long是32位
  • 处理器具有严格的对齐要求,即16位值只能在2字节边界上访问,32位值只能在4字节边界上访问。

以下结构将占用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM