【发布时间】: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