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