2012-05-19 17 views
5

Ho provato questoCome allineare un membro struct in D?

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

ma

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

fallisce, mi dice l'allineamento è ancora 1 invece di 8.

Perché è questo, e come lo aggiusto, in modo che funzioni per qualsiasi allineamento arbitrario che è una potenza di 2 (non solo 8)?

risposta

5

Navigando fonte DMD, sembra che alignof non tiene conto align attributi.

Qui è dove viene gestita:

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

Questo trasforma un'espressione .alignof in un size_t un'espressione con un valore alignsize(), quindi diamo un'occhiata a alignsize() per una matrice statica:

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

E 'solo ottiene l'allineamento del tipo di elemento (void) nel tuo caso.

void è gestita da TypeBasic::alignsize(), che solo in avanti per TypeBasic::size(0)

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

Guardando a come gestire altri tipi alignof, esso non sembra align attributi sono presi in considerazione a tutti, ma potrei sbagliarmi . Può valere la pena testare manualmente l'allineamento.

+0

lol attendi quindi cosa fa "allineare"? E 'solo lì per la decorazione? xD – Mehrdad

+0

Penso che 'align' funzioni, ma' alignof' ottiene solo l'allineamento del tipo, quindi sono cose separate. –

+0

Strano, mi sono imbattuto in problemi che mi hanno portato a controllare 'alignof' ... devo ricontrollare se .. – Mehrdad