我试过这个
struct Foo(T)
{
align(8) void[T.sizeof] data;
}
但
static assert(Foo!(int).data.alignof == 8);
失败,告诉我对齐仍然是1
而不是8
。
为什么会这样,以及如何修复它,以便它适用于2的幂(不仅仅是8)的任意对齐?
答案 0 :(得分:5)
浏览DMD来源,看起来alignof
没有考虑align
属性。
以下是处理的地方:
... if (ident == Id::__xalignof)
{
e = new IntegerExp(loc, alignsize(), Type::tsize_t);
}
这会将.alignof
表达式转换为值size_t
的{{1}}表达式,所以让我们看一下静态数组的alignsize()
:
alignsize()
它只是在你的情况下获得元素类型(unsigned TypeSArray::alignsize()
{
return next->alignsize();
}
)的对齐。
void
由void
处理,只转发到TypeBasic::alignsize()
TypeBasic::size(0)
看看其他类型如何处理switch (ty)
{
...
case Tvoid:
size = 1;
break;
...
}
,看起来根本不考虑alignof
属性,但我可能错了。可能值得手动测试对齐。