2010-08-27 14 views

Respuesta

13

Este suele ser el caso, pero no está garantizado.

Cualquier estructura puede tener bytes de relleno sin nombre al final de la estructura, pero estos se usan generalmente para propósitos de alineación, lo cual no es una preocupación si solo tiene un elemento único.

+3

_que no es una preocupación si solo tiene un elemento simple En realidad, el manejo de un solo elemento en una estructura puede rellenarse por motivos de alineación/rendimiento. Por lo general, el ejemplo es un 'char array [6]' en un sistema de 32 bits, puede rellenar con 2 bytes adicionales para que sea un múltiplo entero de 4 bytes (32 bits). – mctylr

+1

@mctylr: Me sorprendería un poco si ese comportamiento fuera típico. No puede haber relleno entre los elementos de una matriz, por lo que un 'char [6]' tendrá un tamaño de seis bytes y un 'char [6] [2]' tendrá un tamaño de 12 bytes. No veo el beneficio de alinear un tipo 'struct S {char c [6]; }; 'diferente que el elemento de tipo' char [6] 'que contiene. –

+1

Quise decir tratarlo como 'struct S = {char array [6]; char pad [2];} 'Dado que la CPU de 32 bits va a acceder a 8 bytes de todos modos, si' struct S' se encuentra dentro de una segunda matriz 'struct S aS []' los elementos de la matriz se alinean en límites de alineación. No esperaría que fuera común, pero posible. He visto personas que no asumen ese relleno cuando escriben estructuras directamente a través de fwrite/write en un archivo binario o en una toma de red, y puede romperse y se rompe. – mctylr

12

No tiene que ser igual, debido al relleno de la estructura.

section 6.7.2.1 in the C99 standard indica que "Puede haber un relleno sin nombre dentro de un objeto de estructura, pero no al principio".

Esto se conoce como relleno de estructura. Se pueden agregar almohadillas para asegurarse de que la estructura esté alineada correctamente en la memoria. El tamaño exakt de una estructura puede cambiar si cambia el orden de sus miembros.

+1

O, dos párrafos más adelante, "Puede haber un relleno sin nombre al final de una estructura o unión". –

+0

Eso no es particularmente útil, ya que el OP etiquetó tanto C++ como C. – Puppy

+1

Pero, ¿el relleno entra en juego si solo hay un miembro de la estructura? Esa es la pregunta del OP, y hasta ahora no he encontrado nada definitivo en n1256.Por ejemplo, por gcc, el tamaño de una estructura que contiene una única matriz de 3 elementos de char es 3; sin relleno. Agregue un int siguiendo la matriz, y el tamaño de la matriz es 8, por lo que hay un byte de relleno entre los elementos. –

1

Depende del embalaje de su compilador. Por lo general, el tamaño de una estructura es divisible por la longitud de palabra de su sistema (por ejemplo, 4 bytes == 32 bits).

por lo que a menudo tienen sizeof(struct S) > sizeof(SomeType)

Para la mayoría de los compiladores se puede modificar el tamaño del embalaje usando pragmas compilador. Si configura #pragma pack(1) , entonces los tamaños deben ser iguales.

+1

generalmente no depende del embalaje. La alineación de una estructura generalmente se calcula como la alineación más fuerte de los miembros de la estructura. Si todos los miembros son caracteres, la alineación en la mayoría de los casos será 1 (independientemente del embalaje predeterminado). – user396672

Cuestiones relacionadas