在C语言中,“最严格的类型”是什么意思?

14
在《C程序设计语言》第8.7节“示例-存储分配器”中,讨论了“最严格类型”。尽管计算机不同,但对于每台计算机,都有一种最严格的类型:如果可以在一个特定地址存储最严格的类型,则所有其他类型也可以。 在某些机器上,最严格的类型是“double”;在其他机器上,“int”或“long”也足够。在他们的代码中,使用类型“long”对齐union header。
什么是最严格类型?它可能是最大的类型(如double),还是有其他方法?

1
定义一个包含所有类型的联合体,并查看联合体的大小,以找出最具限制性的类型。 - lychee
1
@BsD - 这会给你最大的类型。它可能是最具限制性的,也可能不是。 - Pete Becker
3个回答

16

中央处理器通常要求某些数据类型存储在某些(2的幂次方)倍数的地址上,或者说以这种方式工作更加高效。这个值被称为数据的 对齐方式。例如,CPU可能要求四字节整数存储在四的倍数的地址上(即它们具有 四字节对齐以四个字节对齐 )。

通过 最严格的类型,他们指的是在这个领域具有最严格要求的类型。因此,如果例如 long double 在某台机器上需要8字节对齐,而没有其他类型需要更高的对齐要求,那么在该机器上最严格的类型将是 long double

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

并不一定较大的数据类型需要更高的对齐值,尽管随着大小的增加,对齐要求往往会增加。

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


5
最严格的类型由max_align_tstddef.h中定义。根据标准:
基本对齐方式由小于或等于实现在所有上下文中支持的最大对齐方式表示,即_Alignof(max_align_t)
因此,max_align_t的对齐方式至少与每个标量类型的对齐方式一样大,并且在大多数实现中,它的对齐方式将等于最大的标量类型 - 但是标准不要求这种相等性。
标准进一步要求(我强调):
连续调用aligned_alloccallocmallocrealloc函数分配的存储的顺序和连续性是未指定的。如果分配成功,则返回的指针适当地对齐,因此它可以分配给具有基本对齐要求的任何对象类型的指针,然后用于访问在分配的空间中分配的这样的对象或这样的对象数组(直到显式释放该空间为止)。
因此,由分配函数返回的任何指针的对齐方式至少max_align_t的对齐方式严格一致。

1
我不是那个点踩者,但也许他们想要一个更高层次的概述类型对齐要求的概念。在了解max_align_t和标准中的段落之前,深入挖掘可能有些过度了。 - Ulfalizer
2
@Ulfalizer 说得对,但这并不能完全证明为什么要给我点个踩.. 这个问题对我来说不是很清楚,而我的回答特别针对问题中的“什么意思最严格的类型,也许是最大的类型大小(例如双倍)或者还有其他方法”的部分。 - Daniel Kleinstein
1
是的,我个人只会对垃圾邮件和明显提供错误建议的答案进行负面评价。我同意不给出理由是很糟糕的行为。 - Ulfalizer

2

我认为该引用意味着类型的最严格对齐方式。例如,如果按照这种逻辑,char是最不限制类型。 char类型的对象不会对其对齐方式施加任何约束,而例如int类型通常具有4字节边界的对齐要求。因此,int比char更具限制性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接