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

Meh*_*dad 5 d alignment alignof

我试过这个

struct Foo(T)
{
    align(8) void[T.sizeof] data;
}
Run Code Online (Sandbox Code Playgroud)

static assert(Foo!(int).data.alignof == 8);
Run Code Online (Sandbox Code Playgroud)

失败了,告诉我对齐仍然是1代替8.

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

Pet*_*der 5

浏览DMD源,看起来alignof似乎没有考虑align属性.

这是处理它的地方:

... if (ident == Id::__xalignof)
{
    e = new IntegerExp(loc, alignsize(), Type::tsize_t);
}
Run Code Online (Sandbox Code Playgroud)

这会将.alignof表达式转换为size_t带有值的表达式alignsize(),所以让我们看一下alignsize()静态数组:

unsigned TypeSArray::alignsize()
{
    return next->alignsize();
}
Run Code Online (Sandbox Code Playgroud)

它只是void在你的情况下得到元素类型()的对齐方式.

void处理TypeBasic::alignsize(),只是转发TypeBasic::size(0)

switch (ty)
{
    ...
    case Tvoid:
        size = 1;
        break;
    ...
}
Run Code Online (Sandbox Code Playgroud)

看看其他类型如何处理alignof,看起来根本不考虑align属性,但我可能是错的.可能值得手动测试对齐.