2009-06-19 7 views

Respuesta

23

No, simplemente compone todos los elementos en un elemento de nivel superior cuyo tamaño es simplemente el tamaño de los elementos individuales (más un relleno dependiendo de las reglas de alineación, pero eso está fuera del alcance de esta pregunta).

+0

1 por mencionar alineación. –

+1

Para conocer el efecto de la alineación en las estructuras, consulte http://www.unidata.ucar.edu/blogs/default/2009/03/30/1238442300000.html – VolkerK

12

No si puede evitarlo - no. C evita los gastos generales como la peste. Y específicamente, evita gastos indirectos en este contexto.

Si ha utilizado una estructura diferente, es posible que vea una diferencia:

struct space_filled 
{ 
    char  part0; 
    double  part1; 
}; 

Si la máquina requiere double a estar alineados en un límite de 8 bytes (y sizeof(double) == 8, lo cual es normal, pero no el mandato de la estándar), entonces encontrará que la estructura ocupa 16 bytes.

+0

Un char y el doble declarados por separado aún ocuparían la misma cantidad de espacio, ya que el relleno aún estaría allí. Simplemente sería un espacio de pila invisible. Pero por las direcciones de los elementos revelaría el relleno. – abelenky

+0

No necesariamente: si hubiera otro char, o un short o un int, o uno de cada uno en secuencia (bajo suposiciones de tamaño bastante normal), entonces no habría espacio. Pero en ausencia de tales variables de "relleno", tienes razón. (Y no creo que el estándar C garantice que las variables locales se distribuirán en un orden particular relativo entre sí.) –

+1

@Jonathan: Estoy bastante seguro de que no es así, por lo que el compilador podría ordenar automáticas sin embargo le gusta ahorrar espacio, si quisiera. De hecho, mientras un puntero a la automática no salga del ámbito local, no creo que las automáticas necesiten estar en la pila, el compilador puede mantenerlas en registros si así lo desea. Creo. –

3

No. Struct no añadir cualquier tamaño, o tiene cualquier sobrecarga en el compilado C.

Es una capa de sintaxis que requiere trabajo adicional por el compilador, pero no tiene ninguna sobrecarga en tiempo de ejecución.

C es un lenguaje extremadamente "desnudo", lo que significa que no hay nada a menos que sea necesario. Entonces pregúntese: "¿Qué gastos generales requiere una estructura?", Y no encontrará ninguno.

2

No, no lo hace.

Ese es uno de los puntos buenos de las estructuras (por qué fueron tan útiles en la programación TCP/IP de la vieja escuela).

Es una buena forma de representar el diseño de memoria/búfer.

0

ningún tipo struct en C justo Disposición del secuencialmente los miembros en la memoria

5

No, la estructura no tiene que añadir nada. A diferencia de Java o .NET, donde las clases (y las estructuras) tienen muchas otras responsabilidades, en C y C++, son simplemente contenedores que se usan para contener un número de miembros de datos. En C++, es posible que tengan que almacenar un vtable para resolver las llamadas a funciones virtuales, si es que existe alguna, pero en general, no, una estructura en sí misma no tiene gastos generales.

La única excepción es la siguiente:

typedef struct {} empty; 
assert(sizeof(empty) > 0); 

El tamaño de una estructura vacía no ser cero. Una estructura tiene que tener alguna tamaño distinto de cero, ya que cada objeto debe tener una dirección única. (De lo contrario no sería capaz de crear una matriz de estas estructuras)

+1

+1 por mencionar la estructura vacía. –