我试过了
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
的alignsize()
表达式,因此让我们看一下静态数组的alignsize()
:unsigned TypeSArray::alignsize()
{
return next->alignsize();
}
在您的情况下,它只是获取元素类型(
void
)的对齐方式。void
由TypeBasic::alignsize()
处理,它仅转发到TypeBasic::size(0)
switch (ty)
{
...
case Tvoid:
size = 1;
break;
...
}
查看其他类型如何处理
alignof
,看起来根本不考虑align
属性,但是我可能是错的。可能值得手动测试对齐方式。关于alignment - 如何在D中对齐结构成员?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10661518/