2012-05-19 30 views
5

yo probamos este¿Cómo alinear un miembro de estructura en D?

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

pero

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

falla, diciéndome la alineación sigue siendo 1 en lugar de 8.

¿Por qué es esto, y cómo lo arreglo, para que funcione para cualquier alineamiento arbitrario que sea una potencia de 2 (no solo 8)?

Respuesta

5

Al navegar por la fuente DMD, parece que alignof no tiene en cuenta los atributos align.

Aquí es donde se maneja:

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

Esto convierte una expresión .alignof en una expresión size_t con valor alignsize(), por lo que vamos a ver alignsize() para una matriz estática:

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

Simplemente obtiene la alineación del tipo de elemento (void) en su caso.

void es manejado por TypeBasic::alignsize(), que simplemente reenvía a TypeBasic::size(0)

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

En cuanto a cómo manejar otros tipos alignof, que no se ve como align atributos se tienen en cuenta en absoluto, pero podría estar equivocado . Puede valer la pena probar la alineación manualmente.

+0

lol wait ¿qué significa 'align' do? ¿Está ahí solo para la decoración? xD – Mehrdad

+0

Creo que 'align' funciona, pero' alignof' solo obtiene la alineación del tipo, por lo que son cosas separadas. –

+0

Extraño, me encontré con problemas que me llevaron a comprobar 'alignof' ... tengo que verificarlo dos veces ... – Mehrdad

Cuestiones relacionadas