aligned_alloc函数要求

时间:2016-12-08 03:37:55

标签: c memory-management memory-alignment

我正在查看对齐的alloc()的解释: http://en.cppreference.com/w/c/memory/aligned_alloc

void *aligned_alloc( size_t alignment, size_t size );

"分配未初始化存储的大小字节,其对齐方式由对齐指定。 size参数必须是alignment的整数倍。"

但是,示例代码使用它如下:

int *p2 = aligned_alloc(1024, 10*sizeof *p2);

10 * sizeof * p等于40,所以它不是1024的整数倍。

我误解了什么?

2 个答案:

答案 0 :(得分:4)

实际上,似乎C11标准无法自己构思,并不断改变要求:最初它是一个未定义的行为,然后使用DR 460他们将其更改为失败并返回空指针,现在看起来好像他们想要将其更改为接受任何值作为参数: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2072.htm

编译器似乎并不关心这些限制。

答案 1 :(得分:1)

根据your own reference

  

传递size不是alignmentalignment的整数倍,但该实现无效或不支持导致该函数失败并返回空指针( C11,已发布,在这种情况下指定了未定义的行为,这由DR 460纠正。

编译器可能会遵循C11规则接受此操作,但没有为DR 460更新,并且在这种情况下决定“未定义”意味着“工作”。当然,它也可能意味着“成功,但没有对齐或分配对齐字节最小”。这是未定义的。 耸肩

对于示例代码,它可能是在澄清之前编写的,并且与标准要求不一致,或者写了一个拼写错误(正如评论中所建议的那样,它可能是1024 * sizeof *p2 )。