2012-05-19 5 views
5

私は、アライメントはまだ1の代わり8である私に言って、失敗したこのDで構造体メンバを揃える方法は?

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

しかし

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

を試してみました。

これはなぜですか、どのように修正するのですか?2の累乗(8だけではない)の任意の位置合わせで動作するように修正するにはどうすればよいですか?

答えて

5

DMDソースを参照すると、alignofalign属性を考慮していないようです。それが処理されるのはここ

は次のとおりです。

... if (ident == Id::__xalignof) 
{ 
    e = new IntegerExp(loc, alignsize(), Type::tsize_t); 
} 

これは値alignsize()size_t式に.alignof式を変換し、その者は、静的配列のためalignsize()を見てみましょう:

unsigned TypeSArray::alignsize() 
{ 
    return next->alignsize(); 
} 

それはちょうどあなたの場合、要素タイプ(void)のアライメントを取得します。

voidがちょうど前方TypeBasic::size(0)

switch (ty) 
{ 
    ... 
    case Tvoid: 
     size = 1; 
     break; 
    ... 
} 

に他の種類はalignofを処理する方法を見てみるとTypeBasic::alignsize()によって処理され、align属性は全く考慮されているようにそれは見えませんが、私は間違っている可能性が。アラインメントを手動でテストする価値があります。

+0

lol待ってて、 'align'は何をしますか?それは装飾のためだけにあるのですか? xD – Mehrdad

+0

'align'はうまくいくと思いますが、' alignof'は型の整列だけを取得するので、別々のものです。 –

+0

奇妙なことに、私は 'alignof'をチェックするようになった問題にぶち当たっていました。 – Mehrdad

関連する問題