如何在D中对齐结构成员?

时间:2012-05-19 01:10:51

标签: alignment d alignof

我试过这个

struct Foo(T)
{
    align(8) void[T.sizeof] data;
}

static assert(Foo!(int).data.alignof == 8);

失败,告诉我对齐仍然是1而不是8

为什么会这样,以及如何修复它,以便它适用于2的幂(不仅仅是8)的任意对齐?

1 个答案:

答案 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(); } )的对齐。

voidvoid处理,只转发到TypeBasic::alignsize()

TypeBasic::size(0)

看看其他类型如何处理switch (ty) { ... case Tvoid: size = 1; break; ... } ,看起来根本不考虑alignof属性,但我可能错了。可能值得手动测试对齐。