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);
}

これは式を value を持つ.alignof式に変換するので、静的配列を見てみましょう:size_talignsize()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 に答える