[C con Clase] problema con sizeof()

Steven Davidson srd4121 en njit.edu
Mar Abr 27 16:24:24 CEST 2010


Hola Reignerok,

2010/4/27 Reignerok <reignerok en gmail.com>

> Entonces, si he entendido bien, no es efectivo, desde el punto de vista del
> uso de memoria, agrupar en registros campos que ocupen mucho con otros que
> ocupen poco, ¿no? Y la típica estructura array/variable en el que la
> variable contiene los elementos usados del array sería bastante poco
> efectiva, ¿verdad?
>
>

Ciertamente, la estructura puede derrochar memoria, pero no suele ser
una gran pérdida. Lo normal es que algunos bytes se queden en desuso.
Podrías reorganizar los campos de la estructura para optimizarla. Por
ejemplo,

struct A
{
  char c;
  int num;
  char cc;
  short int si;
  int num2;
};

Esta estructura ocuparía 16 bytes, cuando el cómputo por campo es 12 bytes.

Si colocamos los campos estratégicamente, es posible que nos acerquemos al
tamaño óptimo. Por ejemplo,

 struct A
{
  char c;
  char cc;
  short int si;
   int num;
  int num2;
};

Aquí la estructura 'A' sí ocupa 12 bytes, que es justo el tamaño por campo.

En cuanto a la otra pregunta, si te refieres a un array de estructuras,
entonces posiblemente ese derroche por estructura agrave el derroche del
array.

Si te refieres a una estructura de arrays, entonces debes tener cuidado.
Aunque se trate de un array, realmente tenemos varios elementos de un solo
tipo. Esto es, tenemos varios bloques accesibles a través de un solo campo:
el array en sí. Ahora bien, para el cálculo del tamaño de la estructura, el
array no es considerado como un solo tipo de dato, sino como un tipo
compuesto de elementos agrupados. Por ejemplo,

struct B
{
  char c;
  int num;
  short int lista[11];
};

La estructura ocuparía 20 bytes, cuando por campos el tamaño es de 16 bytes.
Nuevamente, si reescribimos los campos estratégicamente, podemos obtener
este tamaño "correcto"; por ejemplo,

 struct B
{
  char c;
  short int lista[11];
   int num;
};


Espero haber aclarado las dudas.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100427/ff87e661/attachment.html>


Más información sobre la lista de distribución Cconclase