私はこれを試しました
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);
}
これは式を 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配置を手動でテストする価値があるかもしれません。