我试过了

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_talignsize()表达式,因此让我们看一下静态数组的alignsize():
unsigned TypeSArray::alignsize()
{
    return next->alignsize();
}

在您的情况下,它只是获取元素类型(void)的对齐方式。
voidTypeBasic::alignsize()处理,它仅转发到TypeBasic::size(0)
switch (ty)
{
    ...
    case Tvoid:
        size = 1;
        break;
    ...
}

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

关于alignment - 如何在D中对齐结构成员?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10661518/

10-11 18:27