私はこれを試しました
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_t
alignsize()
alignsize()
unsigned TypeSArray::alignsize()
{
return next->alignsize();
}
void
あなたの場合、要素タイプ( )の配置を取得するだけです。
void
によって処理されTypeBasic::alignsize()
、転送するだけですTypeBasic::size(0)
switch (ty)
{
...
case Tvoid:
size = 1;
break;
...
}
他のタイプがどのように を処理するかを見ると、属性がまったく考慮されalignof
ていないように見えますが、間違っている可能性があります。align
配置を手動でテストする価値があるかもしれません。