[email protected] 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!