2012-05-19 8 views
5

ich versucht, diesesWie richtet man ein Strukturelement in D aus?

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

aber

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

versagt, mich um die Ausrichtung zu sagen ist noch 1 statt 8.

Warum ist das, und wie behebe ich es, so dass es für jede beliebige Ausrichtung funktioniert, die eine Potenz von 2 (nicht nur 8) ist?

Antwort

5

Beim Durchsuchen der DMD-Quelle sieht es so aus, als ob alignofalign Attribute nicht berücksichtigt.

Hier ist, wo es behandelt wird:

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

Dieser wandelt ein .alignof Ausdruck in einen size_t Ausdruck mit dem Wert alignsize(), also lassen Sie uns für eine statische Array bei alignsize() aussehen:

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

Es ist einfach bekommt in Ihrem Fall die Ausrichtung des Elementtyps (void).

void von TypeBasic::alignsize() behandelt wird, die gerade nach vorne zu TypeBasic::size(0)

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

Betrachtet man, wie andere Arten behandeln alignof, es sieht nicht so aus align Attributen überhaupt berücksichtigt werden, aber ich könnte falsch sein . Es kann sich lohnen, die Ausrichtung manuell zu testen.

+0

lol warte so was tut 'align' tun? Ist es nur zur Dekoration da? xD – Mehrdad

+0

Ich denke, 'align' funktioniert, aber 'alignof' bekommt nur die Ausrichtung des Typs, so dass sie getrennte Dinge sind. –

+0

Komisch, ich stieß auf Probleme, die dazu führten, dass ich "alignof" überprüfe ... muss aber nochmal nachsehen .. – Mehrdad

Verwandte Themen