2008-09-27 13 views

Respuesta

0

Supongo que quiere decir struct y no strict, pero en un sistema de 32 bits será de 5 u 8 bytes, dependiendo de si el compilador está rellenando la estructura.

0

Sospecho que te refieres a 'struct', no 'strict' y 'char' en lugar de 'Char'.

El tamaño dependerá de la implementación. En la mayoría de los sistemas de 32 bits, probablemente serán 5 - 4 bytes para el puntero, uno para el char. No creo que la alineación entre en juego aquí. Sin embargo, si cambió 'c' y 'b', el tamaño puede crecer a 8 bytes.

Ok, lo probé (g ++ 4.2.3, con la opción -g) y consigo 8.

+1

alineación * podría * entrar en juego. – jop

1

Esto variará dependiendo de su arquitectura y la forma en que trata a los tipos de datos básicos. También dependerá de si el sistema requiere una alineación natural.

2

El valor exacto es sizeof (a).
También puede correr un riesgo y asumir que en este caso es no menos de 2 y no más de 16.

+0

Aunque, en teoría, no existe un límite superior ya que la implementación y el tamaño de los punteros son específicos del compilador siempre que se comporten de acuerdo con el estándar. – Skizz

9

Al contrario de lo que han dicho otras respuestas, en la mayoría de los sistemas, a falta de Opción pragma o compilador, el tamaño de la estructura será de al menos 6 bytes y, en la mayoría de los sistemas de 32 bits, 8 bytes. Para sistemas de 64 bits, el tamaño podría ser fácilmente de 16 bytes. La alineación entra en juego; siempre. El tamaño de una única estructura debe ser tal que se pueda asignar una matriz de esos tamaños y los miembros individuales de la matriz estén suficientemente alineados para el procesador en cuestión. En consecuencia, si el tamaño de la estructura era 5 como otros han hipotetizado, entonces una matriz de dos de tales estructuras tendría 10 bytes de longitud, y el puntero char en el segundo miembro de la matriz estaría alineado en un byte impar, lo que (en la mayoría procesadores) causan un cuello de botella importante en el rendimiento.

+0

Y en los viejos Mac de 68k, ¡crash! –

+0

La razón por la que planteé la hipótesis de que la alineación no tendría ningún efecto aquí es que ambos miembros estarían correctamente alineados sin relleno entre ellos. No esperaba que sizeof tuviera en cuenta el relleno al final. Mi hipótesis ha sido desmentida experimentalmente, como noté en una edición de mi respuesta. –

32
#include <stdio.h> 

typedef struct { char* c; char b; } a; 

int main() 
{ 
    printf("sizeof(a) == %d", sizeof(a)); 
} 

Me sale "sizeof (a) == 8", en una máquina de 32 bits. El tamaño total de la estructura dependerá del embalaje: en mi caso, el empaque predeterminado es 4, por lo que 'c' toma 4 bytes, 'b' toma un byte, dejando 3 bytes de relleno para llevarlo al siguiente múltiplo de 4 : 8. Si desea modificar este embalaje, la mayoría de los compiladores tienen una forma de alterar, por ejemplo, en MSVC:

#pragma pack(1) 
typedef struct { char* c; char b; } a; 

da sizeof (a) == 5. Si lo hace, tenga cuidado de restablecer el embalaje antes de cualquier encabezado de biblioteca!

+3

Para asegurarse de que funciona: printf ("sizeof (a) ==% d", (int) sizeof (a)); ' –

+1

@ ThomasPadron-McCarthy En lugar de 'printf ("% zu ", sizeof (a)) '... –

+0

@ H2CO3: Sí, eso también funciona, en un entorno moderno C. –

0

El tamaño de la estructura debe ser de 8 bytes en un sistema de 32 bits, de modo que el tamaño de la estructura sea múltiplo de 2. Esto hace que las estructuras individuales estén disponibles en los límites de bytes correctos cuando se declara una matriz de estructuras. Esto se logra rellenando la estructura con 3 bytes al final.

Si la estructura tenía el puntero declarado después de la char, aún tendría 8 bytes de tamaño pero el relleno de 3 bytes se habría agregado para mantener el puntero (que es un elemento de 4 bytes) alineado a 4 bytes límite de dirección.

La regla de oro es que los elementos deben estar en un desplazamiento que es el múltiplo de su tamaño de byte y la estructura en sí misma debe ser de un tamaño que es un múltiplo de 2.

+0

Es relativamente poco común, pero una estructura que contiene solo matrices de caracteres podría tener un tamaño extraño: 'struct unusual {char a [3]; char b [4]; }; 'podría tener un tamaño de 7 sin causar ningún efecto perjudicial. Un compilador aún puede rellenarlo en 8 bytes, pero no hay necesidad obvia de hacerlo. –

4

Si desea contarlo manualmente, el tamaño de una estructura es justo el tamaño de cada uno de sus miembros de datos después de considerar la alineación. No hay bytes de sobrecarga mágicos para una estructura.

Cuestiones relacionadas