On Sat, 21 Feb 2015 09:55:53 +0100 k...@shike2.com wrote: > > char *name; /* string representation of op */ > > - int type; /* from Tok.type */ > > - int prec; /* precedence */ > > - int nargs; /* number of arguments (unary or binary) */ > > - int lassoc; /* left associative */ > > + char type; /* from Tok.type */ > > + char prec; /* precedence */ > > + char nargs; /* number of arguments (unary or binary) */ > > + char lassoc; /* left associative */ > > } Op_info; > > I don't have any problem with the patch, but the advantage of this > patch depends too much of which machine you are using. In a > i386/x86-64 the code is going to be similar and you are going to save > memory, but in other processors maybe you need aditional operations to > transform the char (which can be signed or unsigned) to integer. I > usually put flags as integers because you don't save too much > (if you have four options like this case) and you don't know if the > code is going to be smaller or not.
It all comes down to alignment: For 32 Bit / 64 Bit machines (assuming int is 32 bit and char is 8 bit). Signed, unsigned makes no difference, assuming self-aligned (which is the case on x86, x86_64 and ARM): OLD char *name; /* 4 bytes */ /* 8 bytes */ int type; /* 4 bytes */ /* 4 bytes */ int prec; /* 4 bytes */ /* 4 bytes */ int nargs; /* 4 bytes */ /* 4 bytes */ int lassoc; /* 4 bytes */ /* 4 bytes */ ----------------------------------------- 24 bytes 28 bytes NEW char *name; /* 4 bytes */ /* 8 bytes */ char type; /* 1 byte */ /* 1 byte */ char prec; /* 1 byte */ /* 1 byte */ char nargs; /* 1 byte */ /* 1 byte */ char lassoc; /* 1 byte */ /* 1 byte */ ----------------------------------------- 8 bytes 12 bytes You would only get padding-issues when mixing ints and chars, or putting the pointer somewhere else than the beginning (because pointer-alignment has to be in effect. ints have to be 4 byte-aligned, so an int following a pointer-aligned char would have 3 bytes of padding inbetween. But there is no problem here. char's are fine, but I didn't look too deep into the code. The reason why often chars have no advantage over ints is exactly when ints and chars are mixed, given they both need 4 bytes of memory at the end of the day. Cheers FRIGN -- FRIGN <d...@frign.de>