2011-07-22 14 views
7

Disculpe una pregunta estúpida, pero si necesito asegurar la alineación de una estructura/clase/unión, debo agregar atributo ((alineado))) a la declaración typedef?Alineación de estructura en GCC (¿debe especificarse la alineación en typedef?)

class myAlignedStruct{} __attribute__ ((aligned(16))); 
typedef myAlignedStruct myAlignedStruct2; // Will myAlignedStruct2 be aligned by 16 bytes or not? 
+1

Definitivamente no es una pregunta estúpida. Creo que myAlignedStruct2 está alineado de la misma manera que myAlignedStruct pero me gustaría estar seguro de ello. ¿Probaste una printf ("tamaños:% d,% d", sizeof (myAlignedStruct), sizeof (myAlignedStruct2)); ? – Shlublu

+0

@Shlublu: 'sizeof' comprueba el embalaje, pero la alineación es diferente. No hay un operador estándar, pero GCC proporciona '__alignof __()' como se ilustra en mi respuesta. –

+0

¡Ah, lo siento, me he confundido! ¡Esto hace que tu pregunta sea aún más interesante! – Shlublu

Respuesta

8

debo añadir atributos ((alineado (Alinear))) a typedef declaración?

n ... typedefs son sólo seudónimos o alias para el tipo real especificado, que no existe como un tipo separado de tener alineación diferente, embalaje, etc ..

#include <iostream> 

struct Default_Alignment 
{ 
    char c; 
}; 

struct Align16 
{ 
    char c; 
} __attribute__ ((aligned(16))); 

typedef Align16 Also_Align16; 

int main() 
{ 
    std::cout << __alignof__(Default_Alignment) << '\n'; 
    std::cout << __alignof__(Align16) << '\n'; 
    std::cout << __alignof__(Also_Align16) << '\n'; 
} 

Salida:

1 
16 
16 
+0

Un poco confundido, ¿Quiere decir sí, myAlignedStruct2 estar alineado por 16 bytes? –

+0

@ Alles: me refiero a "¿debo agregar el atributo ((alineado (alinear))) a la declaración typedef?": No. Sí, "myAlignedStruct2 [will] estará alineado por 16 bytes". Código ilustrativo y salida añadidos arriba .... –

+0

Mi +1. Eso es correcto. Hubo dos Q's y la mención explícita de Sí y No para cada una lo hace muy claro ahora. :) –

6

La respuesta aceptada ("No") es correcta, pero quería aclarar una parte potencialmente engañosa. Agregaría un comentario pero necesito formatear un código; de ahí la nueva respuesta.

typedefs son sólo seudónimos o alias para el tipo real especificado, que no existe como un tipo separado de tener alineación diferente, embalaje, etc ..

Esto es incorrecto, al menos para GCC (el compilador de OP) y GHS. Por ejemplo, la siguiente compila sin errores, mostrando que la alineación puede se adjunta a un typedef.

La alineación perversa (mayor que el tamaño del objeto) es simplemente para el valor de choque y diversión.

#define CASSERT(expr) { typedef char cassert_type[(expr) ? 1 : -1]; } 

typedef __attribute__((aligned(64))) uint8_t aligned_uint8_t; 

typedef struct 
{ 
    aligned_uint8_t t; 
} contains_aligned_char_t; 

void check_aligned_char_semantics() 
{ 
    CASSERT(__alignof(aligned_uint8_t) == 64); 
    CASSERT(sizeof(aligned_uint8_t) == 1); 
    CASSERT(sizeof(contains_aligned_char_t) == 64); 
} 
Cuestiones relacionadas