Que pasa con el sizeof() ???

Miguel Cárdenas mcmail_y2k en yahoo.com
Dom Ene 21 11:48:02 CST 2001


> >    struct ICQHDRv2_CLIENT {
> >       unsigned short  version;
> >       unsigned short command;
> >       unsigned short seq_num;
> >       unsigned long uin;
> >    };
> short version -> 2 bytes - empieza en offset 0
> short command -> 2 bytes - empieza en offset 2
> short seq_num -> 2 bytes - empieza en offset 4
> long uin      -> 4 bytes - empieza en offset ** 8 ** no en 6!
> el sizeof te da eso poque el compilador mete 2 bytes no usados entre el
> seq_num y el uin, para que el uin le quede en el offset 8, multipo de 32bits (4
> bytes), esto hace que pueda realizar algunas optimizaciones, no me acuerdo
> como deshabilitas esto, (man gcc), pero en lo unico que te jode es que tus
> estructuras van a ser
> un poco mas grandes en memoria, es una speed versus size optimization.

Alguien sabe cual es la opcion??? Estuve buscando en el info del gcc y solo
encontre en   Invoking GCC => Code Gen Options

`-fpack-struct'
     Pack all structure members together without holes.  Usually you
     would not want to use this option, since it makes the code
     suboptimal, and the offsets of structure members won't agree with
     system libraries.

Compilo mi programa de prueba asi:

   gcc --pack-struct -o test  test.cc 

pero naranjas!!! me sigue metiendo ese espacio alli que no deseamos tener... 

Tambien busque en   Invoking GCC => Optimize Options   pero no entontre nada
que pueda ayudar... Ahora si que decepcion, la verdad que CHAFA que las
estructuras te las acomoda como se le pega la gana al compilador... y no solo
eso, sino que la supuesta opcion para desactivarlo no sirve!!!

Espero que alguien pueda ayudarme con alguna otra sugerencia...

Saludos!!!

P.D.
BINGO!!! me acaban de pasar en undernet un dato... redeclare la estructura de
prueba de la siguiente manera:

    struct ICQHDRv2_CLIENT {
       unsigned short  version __attribute__((packed));
       unsigned short command __attribute__((packed));
       unsigned short seq_num __attribute__((packed));
       unsigned long uin __attribute__((packed));
    };

y bueno, no solo cada cosa esta en su offset correspondiente, sino que no le
agrega bytes para redondear... Lamentablemente esta persona le perdi contacto
en un netsplit, pero encontre algo del mentado __attribute__  en el info de gcc
tambien... lo pueden encontrarn en "Variable Attributes"... Por cierto, alguien sabe
si este es soportado unicamente en GCC o es estandar del lenguaje C?

Como sea thanx!!! =)

-- 

						 Miguel Cárdenas
						--------------------
						mcmail_y2k en yahoo.com

---------------------------------------------------------
para salir de la lista, enviar un mensaje con las palabras
"unsubscribe ayuda" en el cuerpo a majordomo en linux.org.mx



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