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

时间:2015-03-07 14:46:41

标签: c architecture malloc long-integer memory-alignment

本书 C编程语言讨论"最严格的类型"在第8.7节中,示例 - 存储分配器

  

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

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

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

3 个答案:

答案 0 :(得分:13)

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

通过限制性最强的类型,它们是指在此区域中具有最严格要求的类型。如果是,例如long double在某台计算机上需要八字节对齐,没有其他类型需要更大的对齐,那么该计算机上限制最多的类型将是long double

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

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

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

答案 1 :(得分:5)

限制性最强的类型由max_align_t定义,stddef.h定义了_Alignof (max_align_t)。根据标准:

  

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

所以aligned_alloc的对齐至少与每个标量类型的对齐一样大,并且在大多数实现中,它的对齐方式将等于最大的标量类型 - 但这个相等标准要求

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

  

连续调用分配的存储顺序和连续性   callocmallocreallocmax_align_t函数是。{   不确定的。 如果分配成功,则返回指针   适当地对齐,以便可以将其分配给指向任何类型的指针   具有基本对齐要求的对象然后习惯   在空间中访问这样的对象或这样的对象的数组   已分配(直到空间被明确解除分配)。

因此,分配函数返回的任何指针都与<{1}}的对齐一样严格地对齐

答案 2 :(得分:2)

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