From: Lou Vanek Date: 2006-02-12T06:45:24+09:00 Subject: Re: ruby/dl question Joel VanderWerf wrote: > ara.t.howard@noaa.gov wrote: > >>On Sun, 12 Feb 2006, Joel VanderWerf wrote: > > ... > >>>I don't understand. If the flock struct fields are not in a predictable >>>order, how do you access them in C? >> >>that's what to compiler does - it's why one must say >> >> sizeof(mystruct) >> >>vs. >> >> sizeof(int) + sizeof(float) > > > Ah I see. It isn't that the data structure itself is unpredictable (I > thought maybe you had to read one of the fields to know how the others > are laid out). It's rather that you don't know what the compiler is > doing with it. > > Since there are a variety of alignment and packing options in any > compiler, I don't see how DL could guess what the correct ones are. > Maybe it assumes longword alignment? > > On further digging... in dl.h the extra space taken to align a short, > for example, is computed by... > > typedef struct { char c; short x; } s_short; > #define ALIGN_SHORT (sizeof(s_short) - sizeof(short)) > #define SHORT_ALIGN ALIGN_SHORT > > ...and this is used by the following macro, which advances the offset > var to the next aligned position... > > #define DLALIGN(ptr,offset,align) {\ > while( (((unsigned long)((char *)ptr + offset)) % align) != 0 ) offset++;\ > } > > ...to calculate the struct size in dlsizeof() in dl.c: > > case 'H': > DLALIGN(0,size,SHORT_ALIGN); > case 'h': > size += sizeof(short) * n; > break; > > So I guess if you use 'H', you get aligned shorts (according to whatever > compiler flags ruby and its extensions were compiled with), and if you > use 'h' you get packed shorts. > > > Don't get your shorts out of alignment! ;) And, for what it's worth, both gcc 3.4.4 and VC++ 13.10 pack the two shorts together into the same word on x86.