C中限制性最强的类型是什么意思?

C编程语言 ”一书在第8.7节“ 实例 – 存储分配器 ”中讨论了“限制性最强的类型”:

虽然机器各不相同,但对于每台机器都有一个限制性最强的类型:如果限制性最强的类型可以存储在特定地址,则所有其他类型也可以。 在某些机器上,限制最多的类型是double ; 在其他人, intlong就足够了。

在他们的代码中, union header使用long类型对齐。

限制性最强的是什么意思? 它可能是最大的类型(例如, double ),还是有另一种方法?

如果某些类型的数据存储在某些(二次幂)值的倍数的地址上,CPU通常需要(或者更有效地工作)。 该值称为数据对齐 。 例如,CPU可能要求将四字节整数存储在四倍的地址中(它们具有四字节对齐 ,或者在四个字节对齐 )。

对于限制性最强的类型 ,它们是指在该区域中具有最严格要求的类型。 因此,如果long double需要在某台机器上进行8字节对齐,并且没有其他类型需要更大的对齐,那么该机器上限制最多的类型将是long double

malloc(3)返回满足最严格类型的对齐要求的地址是有意义的,因为这意味着返回的内存可用于存储任何类型。 malloc()不知道如何使用内存,因此无法适应。

虽然对齐要求往往随着尺寸的增加而增加,但不一定是较大数据类型需要更大对齐的情况。

(某些类型的数据可能需要比malloc()提供的更大的对齐。例如,许多x86 SSE指令使用在16个字节上对齐的数据向量,而例如glibc中的malloc()仅保证8字节对齐posix_memalign(3)可用于在POSIX(* nix)系统上以更高的对齐要求动态分配内存。)

限制性最强的类型由max_align_t定义, max_align_tstddef.h定义。 根据标准:

基本对齐由小于或等于所有上下文中的实现所支持的最大对齐的对齐来表示,其等于_Alignof (max_align_t)

因此, max_align_t的对齐至少与每个标量类型的对齐一样大,并且在大多数实现中,它的对齐将等于最大的标量类型 – 但标准要求这种相等。

该标准进一步要求(强调我的):

通过连续调用aligned_alloccallocmallocrealloc函数分配的存储的顺序和连续性未指定。 如果分配成功,则返回指针,以便可以将其分配给指向具有基本对齐要求的任何类型对象的指针 ,然后用于在分配的空间中访问此类对象或此类对象的数组(直到空间明确解除分配)。

因此,分配函数返回的任何指针至少max_align_t的对齐一样严格。

我认为引用意味着最严格的类型对齐。 例如,如果遵循此逻辑,char是最不具有破坏性的类型。 char类型的对象不对其对齐施加约束,而例如int类型具有通常4字节边界的对齐要求。 因此int是比char更具限制性的类型。