5

我试过这个

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

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

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

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

4

1 回答 1

5

浏览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属性,但我可能是错的。手动测试对齐可能是值得的。

于 2012-05-19T11:49:08.347 回答