12 c architecture malloc memory-alignment long-integer
" C编程语言 "一书在第8.7节" 实例 - 存储分配器 "中讨论了"限制性最强的类型" :
虽然机器各不相同,但每台机器都有一个限制性最强的类型:如果限制性最强的类型可以存储在特定地址,则所有其他类型也可以.在某些机器上,限制最多的类型是a
double; 在别人身上,int或是long足够的.
在他们的代码中,union header使用类型对齐long.
限制性最强的是什么意思?它可能是最大的类型(例如double),还是有另一种方法?
Ulf*_*zer 13
如果某些类型的数据存储在某些(二次幂)值的倍数的地址上,CPU通常需要(或者更有效地工作).该值称为数据对齐.例如,CPU可能要求将四字节整数存储在四倍的地址中(它们具有四字节对齐,或者在四个字节上对齐).
通过最严格的类型,他们的意思是在这方面最严格的要求的类型.因此,如果例如long double在某台机器上需要八字节对齐,并且没有其他类型需要更大的对齐,那么该机器上的限制性类型最多long double.
malloc(3)返回满足最严格类型的对齐要求的地址是有意义的,因为这意味着返回的内存可用于存储任何类型.malloc()不知道如何使用内存,因此无法适应.
虽然对齐要求往往随着尺寸的增加而增加,但不一定是较大数据类型需要更大对齐的情况.
(某些类型的数据可能需要比malloc()提供的更大的对齐.例如,许多x86 SSE指令使用在16个字节上对齐的数据向量,而例如malloc()in glibc仅保证8字节对齐.posix_memalign(3)可用于动态分配内存对POSIX(*nix)系统的更高对齐要求.)
限制性最强的类型由定义max_align_t,定义于stddef.h.根据标准:
基本对齐由小于或等于所有上下文中的实现所支持的最大对齐的对齐来表示,其等于
_Alignof (max_align_t).
因此max_align_t,对齐至少与每个标量类型的对齐一样大,并且在大多数实现中,它的对齐将等于最大的标量类型 - 但标准不要求这种相等.
该标准进一步要求(强调我的):
的顺序和连续调用到所分配的存储的邻接
aligned_alloc,calloc,malloc,和realloc功能是不确定的.如果分配成功,则返回指针,以便可以将其分配给指向具有基本对齐要求的任何类型对象的指针,然后用于在分配的空间中访问此类对象或此类对象的数组(直到空间被明确释放).
因此,分配函数返回的任何指针至少与对齐方式一致max_align_t.