Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C联合校准_C_Alignment_Unions - Fatal编程技术网

C联合校准

C联合校准,c,alignment,unions,C,Alignment,Unions,在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

在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字段从未被使用;它只是强制每个标题在一个页面上对齐。”
最坏情况边界”。我已经读了很多遍了,但是仍然不明白为什么对齐需要很长的时间。大小是一个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
的并集中会迫使编译器将结构放在4字节边界上,否则它可以放在2字节边界上。

在大多数系统上仍然如此。记住台式机、智能手机和平板电脑是例外,甚至它们包含许多更小的嵌入式芯片。“重复复制器Trar,我忽略了我的烤面包机中的处理器:”在这种情况下,这不会总计达32位吗?整数是16位,指针是16位,所以加起来就是32位。这难道不意味着不需要很长时间吗?我只是不明白当结构大小等于或大于长类型时,添加长类型有什么帮助。这正是我的问题。我想知道当指针是64位时,
long
如何强制对齐(对于2017年新构建的计算机)。答案帮了大忙。你意识到问题中的代码编写方式完全错误了吗?如果你在64位环境中编译呢?您的ptr可能是64位,但大小可能只有32位。对齐变量x可能有助于对齐到64位边界,如果您有一个联合数组,该边界可能会有某种用途。@HenrikCarlqvist:在这种情况下,
long
不太可能需要比联合指针更强的对齐。