强制结构大小对齐

凯奇

有没有一种方法可以将结构的大小强制为任何类型的最大所需对齐方式的倍数?这是两种不同的尝试:

#include <stdio.h>
#include <stddef.h>
#include <stdalign.h>

typedef struct {
    char c;
} Block1;

typedef struct {
    char c;
    max_align_t data[];
} Block2;

typedef struct {
    char c;
    _Alignas(sizeof(max_align_t)) max_align_t data[];
} Block3;

int
main() {
    printf("sizeof(max_align_t): %zu\n", sizeof(max_align_t));
    printf("sizeof(Block1): %zu\n", sizeof(Block1));
    printf("sizeof(Block2): %zu\n", sizeof(Block2));
    printf("sizeof(Block3): %zu\n", sizeof(Block3));
}

在64位计算机上使用gcc 4.9.2时,我得到了它,因此Block3似乎可以正常工作。有趣的Block2是,虽然我能猜出原因,但它不起作用:

sizeof(max_align_t): 32
sizeof(Block1): 1
sizeof(Block2): 16
sizeof(Block3): 32

只是想知道Block3(根据C11标准)是否可以保证工作,以及是否有更好的方法。

附录:显然,我误解了的含义max_align_t我以为这可以sizeof(max_align_t)提供任何标量类型所需的最大对齐方式,但是显然_Alignof(max_align_t)是这样的。因此Block2实际上有效。

重复数据删除器

有没有一种方法可以将结构的大小强制为最大所需对齐方式的倍数?

好吧,如果您要为其元素指定最大的对齐方式,那就总是这样。大功告成

相反,如果您说的是基本对齐

  1. _Alignas(type)一个部件(你可以不小心降低取向,要求这样)。
  2. 使用上面对齐的类型的成员。您的第二个示例使用了一个可伸缩数组成员。

max_align_t 具有最大的基本对齐方式。

相反,如果您是朋友扩展扩展的alignment_Alignas(power_of_two)(必须诊断出不支持的对齐方式),尽管不能保证完全支持过度对齐的类型。
也没有任何查询最大支持的扩展对齐方式的方法。

6.2.8对象对齐

1完整的对象类型具有对齐要求,这些条件限制了可以分配该类型对象的地址。对齐方式是一种实现定义的整数值,表示可以分配给定对象的连续地址之间的字节数。对象类型对该类型的每个对象都要求对齐要求:可以使用_Alignas关键字要求更严格的对齐方式
2基本对齐方式表示为小于或等于该实现在所有上下文中均支持的最大对齐方式的对齐方式_Alignof (max_align_t)
3扩展的比对表示为大于_Alignof (max_align_t)由实现定义,是否支持任何扩展的对齐方式以及支持它们的上下文。具有扩展对齐要求的类型是过度对齐的类型。57)
4对齐方式表示为该类型的值size_t有效的对齐方式仅包括由_Alignof表达式为基本类型返回的那些值,以及由实现定义的其他值集,这些值可能为空。每个有效的对准值应为2的非负整数幂。
5条路线具有顺序从更严格的路线。更严格的比对具有更大的比对值。满足对齐要求的地址也满足任何较弱的有效对齐要求。
6可以使用_Alignof表达式查询完整类型的对齐要求类型charsigned charunsigned char应具有最弱的对齐要求。
7比较路线是有意义的,并且可以得出明显的结果:

  • 当两个对齐方式的数值相等时,它们是相等的。
  • 当两个对齐方式的数值不相等时,它们是不同的。
  • 当一个路线大于另一个路线时,则表示更严格的路线。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章