加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

联合中的C对齐

发布时间:2020-12-16 09:56:13 所属栏目:百科 来源:网络整理
导读:在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; /*
在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?谢谢.

解决方法

那是一本非常古老的书.当时许多机器上的指针只有16位,而长为32位,因此联合强制对齐为32位.

正如@Deduplicator指出的那样,仍有许多嵌入式系统使用16位指针.

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

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

以下结构将占用32位

struct header {
    struct header *ptr;     
    unsigned size;         
};

但是,结构中的字段仍然是16位.因此,对齐要求仍然只有16位.因此,例如,将结构放置在地址0xAA02将完全有效,因为ptr将位于对齐的地址(0xAA02),并且大小也将位于对齐的地址(0xAA04).

但是,地址0xAA02没有为并集适当地对齐,因为并集的x字段需要32位对齐.因此,将结构放入与x的并集会强制编译器将结构放在4字节边界上,否则它可以放在2字节边界上.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读