【问题标题】:Is there a portable way to find out what alignments are supported by a C11 implementation?是否有一种可移植的方式来找出 C11 实现支持哪些对齐方式?
【发布时间】:2015-03-12 01:26:56
【问题描述】:

上下文是:一个人想要得到一个相当好的内存,例如。允许编译器使用 AVX, AVX2 。同时,人们试图尽可能合理地保持代码的可移植性。使用aligned_alloc 分配听起来不错,但C11 将此列为未定义行为:

“aligned_alloc函数请求的对齐方式无效或实现不支持,或者请求的大小不是对齐方式的整数倍”

因此,例如使用 aligned_alloc(32, 128) 可以经常得到很好的结果,但有一天,它可以是其他编译器中的 UB。

在这种情况下,不那么严格的对齐就足够了,这会产生较慢但正确的代码。因此,在这种情况下,一些理想的方法会要求最严格的对齐,最多可达 128。有没有办法实现这样的目标?

-- 问题主要是关于使用aligned_alloc,而不是创建自己的分配器。

==编辑==

已经在评论中回答了,是_Alignof (max_align_t)

thx chux,我忽略了那个!

【问题讨论】:

  • 如果可移植性很重要,您可以通过分配 n+alignment-1 字节并自行调整指针来保证对齐。
  • 查看max_align_t:“这是一种对象类型,其对齐方式与所有上下文中的实现所支持的一样好;”
  • inferring-memory-alignment 可能有用。
  • 我会留给其他人写一个详细的答案。 GTG
  • coliru.stacked-crooked.com/a/c2172c55743636d8 过度分配并调整自己?

标签: c memory-alignment c11


【解决方案1】:

或者你可以总是对齐。如果你害怕 UB,你可以编写对齐的分配器,唯一真正的问题是你需要释放未对齐的指针:

auto align 16;
auto aqbuf = malloc(alignedSize);
auto aligned = (unsigned char*)(((intptr_t)(aqbuf) + (align-1)) & ~(align-1));//aqbuf != aligned sometimes...
free(aqbuf);//forget about aligned

【讨论】:

  • size_t 需要保存您可以创建的最大对象的大小。它的大小不需要等于指针。为此,请使用intptr_t
  • 我注意到这篇文章被标记为 C 和 C11 但不是 C++,所以reinterpret_cast 可能超出了问题的范围。
  • @CoryNelson 也许我不知道,反正我把size_t 改成了intptr_t
  • @danfuzz,哈哈,好吧,我把它们改成了 C 风格的演员表。
  • 如果你要提供代码,不妨方便调用者:coliru.stacked-crooked.com/a/54a0d7c5e93d9d63
猜你喜欢
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 2015-03-09
  • 2021-05-06
  • 2011-03-24
  • 2015-09-19
  • 2022-01-03
  • 1970-01-01
相关资源
最近更新 更多