Re: ClassDef() Increases class size? + a Question to CINT gurus

Peter Lipa (lipa@nsma.arizona.edu)
Thu, 20 May 1999 18:05:42 -0700


OK, you are right; there's no complier that gives a struct size of 3 but
the point is that ROOT/CINT (always?) pads structs to multiples of 8

Here is a quick comparison of gcc (on Sun/solaris) and RINT results of the
testStruct.c file below:

gcc:
raphe:~/root>gcc testStruct.c -o testStruct
raphe:~/root>testStruct
sizeof(testByte) = 1
sizeof(testStruct) = 4
sizeof(testUnion ) = 4
sizeof(testByteArr[10]) = 10
sizeof(testStructArr[10]) = 40
sizeof(testUnionArr[10]) = 40

RINT:
root [7] .L testStruct.c
root [8] main()
sizeof(testByte) = 8
sizeof(testStruct) = 8
sizeof(testUnion ) = 8
sizeof(testByteArr[10]) = 80
sizeof(testStructArr[10]) = 80
sizeof(testUnionArr[10]) = 80

file:
testSruct.c ----------------------------------------------------------------
-
#include <stdio.h>

void main(){

struct Test0_t{
char c;
};
struct Test0_t testByte;

struct Test1_t{
char c;
short i;
};
struct Test1_t testStruct;

union Test2_t{
char c[3];
short i;
} testUnion;

struct Test0_t testByteArr[10];
struct Test1_t testStructArr[10];
union Test2_t testUnionArr[10];

printf(" sizeof(testByte) = %d\n",sizeof(testByte));
printf(" sizeof(testStruct) = %d\n",sizeof(testStruct));
printf(" sizeof(testUnion ) = %d\n",sizeof(testUnion));
printf(" sizeof(testByteArr[10]) = %d\n",sizeof(testByteArr));
printf(" sizeof(testStructArr[10]) = %d\n",sizeof(testStructArr));
printf(" sizeof(testUnionArr[10]) = %d\n",sizeof(testUnionArr));

}

----- Original Message -----
From: John Zweizig <jzweizig@ligo.caltech.edu>
To: Peter Lipa <lipa@nsma.arizona.edu>
Cc: roottalk <roottalk@hpsalo.cern.ch>
Sent: Thursday, May 20, 1999 4:06 PM
Subject: Re: ClassDef() Increases class size? + a Question to CINT gurus

>
>
> On Thu, 20 May 1999, Peter Lipa wrote:
>
> <snip>
> >
> > struct Test_t {
> > Char_t c;
> > Short_t i;
> > } testStruct;
> >
> > Naively (and rightly so) you would expect to get a sizeof(testStruct) =
3.
> > This you will get e.g. with the gcc compiler and default flags.
> <snip>
>
> Your conclusions about the structure length being different than the sum
> of the lengths of its constituent parts is of course correct, but I have
> never seen a compiler that would allocate 3 bytes for testStruct. In
> general (i.e. on all machines/compilers I have ever seen) the default
> mapping of structures into memory follows three rules:
>
> 1) Structure elements are stored in memory in the order in which they
> were defined.
>
> 2) Each atomic element (a simple variable or a member of a
> sub-structure or array) is aligned on an offset that is a multiple
> of its length.
>
> 3) The structure is padded to give a length that is a multiple of the
> length of the longest atomic element.
>
> Thus for your example structure, ALL compilers I have ever seen
> (including gcc) will give sizeof(struct testStruct) == 4 (assuming
> sizeof(Short_t)==2 and sizeof(Char_t) == 1).
>
>