【问题标题】:Minimum Alignment Requirements for a Machine机器的最低对齐要求
【发布时间】:2017-02-14 13:33:08
【问题描述】:

我正在阅读一本关于编译器设计和实现的书。在关于存储管理的部分,作者编写了一个分配内存的函数。他希望该功能适合任何类型。他声称下面联合的大小是主机上的最小对齐。我不太明白那是什么意思。从书中:“......它的字段是最有可能具有最严格对齐要求的字段。”

union align {
    long l;
    char *p;
    double d;
    int (*f) (void);
};

有人能解释一下“最严格的对齐要求”是什么意思吗?这如何给出主机上的最小对齐?

【问题讨论】:

    标签: c memory-alignment


    【解决方案1】:

    联合的对齐方式被选择为与具有最大对齐要求的成员的对齐方式相同。它的大小选择与最大的成员一样大,并在末尾加上一些额外的填充,以确保在按顺序排列在数组中时对齐不会中断。

    因此,从这个意义上说,union align 将与 lpdf 具有相同的对齐方式(以具有最高对齐要求的为准)。

    例如,如果int (*)(void) 类型的f 成员的对齐要求为8,则整个联合将在8 字节边界上对齐,即使long 只需要@987654330 @。

    我不太确定标准是否保证这 4 种类型中最大的对齐要求将是“主机上的最小对齐”。为了了解编译器在存储管理方面的工作方式,这可能只是一个很好的练习。

    【讨论】:

      【解决方案2】:

      考虑一台机器,由于内存总线的限制,它只能从偶数地址读取 16 位值。

      此类机器上的 16 位值的“对齐要求”为 2。

      不要不要依赖union 诡计。从C11开始,有:

      • max_align_t 是平台 (1) 的最大(标准)标量类型的同义词,即由 malloc() 提供的对齐类型。
      • _Alignof,它给出了给定类型的对齐要求。
      • alignas,允许修改类型的对齐方式。

      (1):最大的这种类型通常long double,你的书的例子中可疑地没有这种类型......

      请注意,编译器可能支持需要特殊处理的“扩展”类型。例如,具有 256 字节的 SSE 数据类型,但具有 malloc()“仅”执行 128 字节对齐。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        • 2018-03-23
        • 1970-01-01
        相关资源
        最近更新 更多