2011-04-08 21 views
10

Esto debe ser simple, pero no tengo idea de dónde buscar el tema:sizeof (struct) devuelve valor inesperado

tengo una estructura:

struct region 
{ 
public: 
    long long int x; 
    long long int y; 
    long long int width; 
    long long int height; 
    unsigned char scale; 
}; 

Cuando hago sizeof(region) me da cuando estoy esperando .

¿Alguna idea?

(gcc MinGW, ganar OS x64)

+0

@sth: ¿Cuál era el sentido de esas ediciones? – eriktous

+1

@eriktous: Me gustó la pregunta e intenté aumentar la relación señal/ruido eliminando el texto que no agregaba nada a la pregunta. – sth

Respuesta

10

Está relleno de la estructura para adaptarse a un límite de 8 bytes. Así que en realidad está tomando 40 bytes en la memoria - sizeof está devolviendo el valor correcto.

Si desea sólo para tomar 33 bytes a continuación, especifique el atributo packed:

struct region 
{ 
public: 
    long long int x; 
    long long int y; 
    long long int width; 
    long long int height; 
    unsigned char scale; 
} __attribute__ ((packed)); 
+7

Tenga en cuenta que el uso de una matriz de estructuras 'empaquetadas' puede dificultar seriamente el rendimiento debido a que los elementos de la estructura no están alineados. –

+0

¡Gracias por eso! – George

+2

¿Hay alguna manera de obtener algún tipo de packed_sizeof (MyStruct)? De esta manera, uno podría usar la estructura como desempaquetada y obtener un buen rendimiento, pero puede usar el tamaño real de la estructura para leer desde el archivo – codymanix

5

long long int valores son 8 bytes cada uno. scale tiene solo 1 byte pero está acolchado para las alineaciones, por lo que también ocupa 8 bytes. 5*8 = 40.

+0

brillante, no sabía que ... ¿alguna forma de evitarlo? quiere leer la estructura del archivo y necesita obtener el tamaño exacto – George

+0

@George: por lo general, vale la pena almacenar los datos como texto sin formato en lugar de en formatos binarios. Consulte la sección de Power of Plain Text en el libro Pragmatic Programmer. – ssegvic

+0

@ssegvic: gracias, pero el archivo se da desde una fuente externa. – George

4

Como otros han dicho, estructuras están acolchadas para las alineaciones, y como relleno no solo depende del tipo de los miembros, sino también en el orden de los miembros en el que están definidas.

Por ejemplo, considere estas dos estructuras A y B como se define a continuación. Ambas estructuras son idénticas en términos de miembros y tipos; la única diferencia es que el orden en el que se definen los miembros no es la misma:

struct A 
{ 
    int i; 
    int j; 
    char c; 
    char d; 
}; 

struct B 
{ 
    int i; 
    char c; 
    int j; 
    char d; 
}; 

estaría el sizeof(A) ser igual a sizeof(B) simplemente porque no tienen igual número de miembros del mismo tipo? Nº Intente imprimir el tamaño de cada uno:

cout << "sizeof(A) = "<< sizeof(A) << endl; 
cout << "sizeof(B) = "<< sizeof(B) << endl; 

Salida:

sizeof(A) = 12 
sizeof(B) = 16 

Sorprendido? Vea la salida usted mismo: http://ideone.com/yCX4S

+2

Gracias - interesante – George