以下摘自 这里
pw = (widget *)malloc(sizeof(widget));
分配原始存储。实际上,malloc 调用分配的存储空间足够大并且 适当对齐以容纳小部件类型的对象
还可以看到来自草本萨特的 快速 pImpl ,他说:
_对齐_。任何内存对齐。 通过 new 或 malloc 动态分配的任何内存都可以保证为任何类型的对象正确对齐,但未动态分配的缓冲区没有这样的保证
我对此很好奇, malloc 怎么知道自定义类型的对齐方式?
原文由 Chang 发布,翻译遵循 CC BY-SA 4.0 许可协议
对齐要求是递归的:任何
struct
的对齐只是其任何成员的最大对齐,这是递归理解的。例如,假设每个基本类型的对齐方式等于它的大小(通常情况并非总是如此),
struct X { int; char; double; }
的对齐方式为double
,它将被填充为double 大小的倍数(例如 4 (int), 1 (char), 3 (padding), 8 (double))。 Thestruct Y { int; X; float; }
has the alignment ofX
, which is the largest and equal to the alignment ofdouble
, andY
is laid out accordingly : 4 (int), 4 (padding), 16 (X), 4 (float), 4 (padding)。(所有数字只是示例,在您的机器上可能会有所不同。)
因此,通过将其分解为基本类型,我们只需要知道少数基本对齐方式,其中有一个众所周知的最大对齐方式。 C++ 甚至定义了一个类型
max_align_t
其对齐方式 是 最大的对齐方式。malloc()
需要做的就是选择一个该值的倍数的地址。