malloc 是如何理解对齐的?

新手上路,请多包涵

以下摘自 这里

pw = (widget *)malloc(sizeof(widget));

分配原始存储。实际上,malloc 调用分配的存储空间足够大并且 适当对齐以容纳小部件类型的对象

还可以看到来自草本萨特的 快速 pImpl ,他说:

_对齐_。任何内存对齐。 通过 new 或 malloc 动态分配的任何内存都可以保证为任何类型的对象正确对齐,但未动态分配的缓冲区没有这样的保证

我对此很好奇, malloc 怎么知道自定义类型的对齐方式?

原文由 Chang 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

对齐要求是递归的:任何 struct 的对齐只是其任何成员的最大对齐,这是递归理解的。

例如,假设每个基本类型的对齐方式等于它的大小(通常情况并非总是如此), struct X { int; char; double; } 的对齐方式为 double ,它将被填充为double 大小的倍数(例如 4 (int), 1 (char), 3 (padding), 8 (double))。 The struct Y { int; X; float; } has the alignment of X , which is the largest and equal to the alignment of double , and Y is laid out accordingly : 4 (int), 4 (padding), 16 (X), 4 (float), 4 (padding)。

(所有数字只是示例,在您的机器上可能会有所不同。)

因此,通过将其分解为基本类型,我们只需要知道少数基本对齐方式,其中有一个众所周知的最大对齐方式。 C++ 甚至定义了一个类型 max_align_t 其对齐方式 最大的对齐方式。

malloc() 需要做的就是选择一个该值的倍数的地址。

原文由 Kerrek SB 发布,翻译遵循 CC BY-SA 4.0 许可协议

  1. 对齐到所有对齐的最小公倍数。例如,如果 int 需要 4 字节对齐,但指针需要 8,则将所有内容分配给 8 字节对齐。这会导致一切都对齐。

  2. 使用 size 参数来确定正确的对齐方式。对于小尺寸,您可以推断出类型,例如 malloc(1) (假设其他类型的尺寸不是 1)始终是 char。 C++ new 具有类型安全的优点,因此可以始终以这种方式做出对齐决策。

原文由 Pubby 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题