【问题标题】:How to determine the minimum alignment of malloc() results on my system?如何确定我系统上 malloc() 结果的最小对齐方式?
【发布时间】:2018-01-12 06:45:41
【问题描述】:

malloc() 没有对齐约束;但由于各种原因,其产生的分配实际上在某种程度上是一致的。例如,this answer 告诉我们,malloc() 结果必须是:

适合任何内置类型对齐

因此,使用 GCC,分配的地址将是多个 __BIGGEST_ALIGNMENT__。好的,很好,但是其他编译器(特别是 clang、MSVC、ICC)呢?我在那里使用什么?那么对于 64 位平台,我是否可以始终假设至少 8 个字节的对齐?也许,在实践中,由于某些设计选择,对齐甚至大于这个最小值?

我真正想要的是一种相对稳健的方法来确定(希望在编译时和最坏情况下在运行时)尽可能接近malloc() 的实际最小对齐的值。

注意事项:

  • 如果一切都失败了,我不介意在我的构建脚本中做一些事情来解决这个问题。但是 - 它必须不是有根据的猜测(例如尝试不同大小的分配并查看会发生什么)。我需要可靠的保证。
  • 我假设malloc()realloc() 的最小对齐方式相同。如果不是这种情况,那么这是一个由两部分组成的问题......

【问题讨论】:

  • 你想在这里解决什么问题?您想实现自己的malloc 版本吗?
  • @Gerhardh:为了便于讨论,假设我想区分我必须手动对齐(因此分配更多)的情况和免费获得它的情况。还有——对你有什么影响?我的意思是,无论我的动机如何,这都不是一个人为的问题。
  • 只要库随编译器工具链一起提供,malloc 函数将始终返回根据该编译器支持的任何数据类型对齐的地址。因此,我怀疑您是否真的必须针对任何数据类型手动对齐它。
  • @Gerhardh:也许我想将它与 L1 缓存的大小对齐?还是虚拟机页面的大小?等
  • 我假设你知道你的对齐要求,所以如果你可以使用 C11 并且如果你不关心最终得到比你指定的更大的对齐,那么使用 @改为 987654330@?

标签: c memory-management alignment malloc cross-platform


【解决方案1】:

C11中你应该可以使用_Alignof(max_align_t);

#include <stdio.h>
#include <stddef.h>

int main(void) {
    size_t a = _Alignof(max_align_t);
    printf("max alignment %zu\n", a);
}

C11 6.2.8p2

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

C11 7.22.3p1:

如果分配成功,则返回的指针经过适当对齐,以便可以将其分配给指向具有基本对齐要求的任何类型对象的指针。

在我阅读时,从 malloc 返回的指针必须至少与 C11 上的 _Alignof(max_align_t) 对齐。

【讨论】:

  • 我不完全确定 max_align_t 是否已经在 C99 中引入,但至少从 C99 开始,malloc 需要返回正确对齐的内存,很可能是 C89 甚至更早。除了chars 之外,其他任何东西都会使它几乎毫无用处。
  • @toohonestforthissite 它不是。
【解决方案2】:

很好的问题。我见过的一种尝试以便携方式执行此操作的方法是创建几个大型类型的联合。工会有其最大成员的规模,因此它应该可以很好地代表您正在寻找的信息。

C Unleashed 中的 Richard Heathfield 经历了构建内存跟踪子系统以帮助查找内存泄漏的过程。他在每次分配开始时存储跟踪元数据,但仍必须确保有效负载适当对齐。为此,在第 279 页,他创建了一个名为 ALIGN 的 typedef 类型,它是 long、unsigned long、double、long double、void 指针和采用 void 的 void 函数指针的联合。

【讨论】:

  • 这是一个有点奇怪的解决方案。与宏相同:#define MAX(a,b) (((a) &gt;= (b)) * (a) + ((b) &gt; (a)) * (b)) #define MAXINTSIZE MAX(sizeof(long), sizeof(long long)) #define MAXFLOATSIZE MAX(sizeof(double), sizeof(long double)) #define MAXTYPE MAX(MAXINTSIZE, MAXFLOATSIZE)
猜你喜欢
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
  • 2010-09-26
相关资源
最近更新 更多