On Sun, 2007-03-18 at 19:01 +0000, John Robinson wrote:
> On 18/03/2007 15:51, Timo Sirainen wrote:
> > On Sat, 2007-03-17 at 01:39 +0100, Václav Haisman wrote:
> [...]
> >> uint32_t flags:8;
> >> uint32_t uid_broken:1;
> >> uint32_t expunged:1;
> >> uint32_t pseudo:1;
> > 
> > Right, I didn't think of that. But that feels a bit ugly :) I don't
> > think it saves much memory anyway, so I'll keep it as uint8_t flags.
> 
> I may be a bit of a novice at this sort of thing, but if you want 
> bitfields, does it matter what you say? In theory at least,
>    unsigned int x:1;
> is all you need, it'll take one bit of storage, there's no point 
> specifying the size of the thing you want truncated to one bit, what 
> you're asking for is precisely one bit to be used as an unsigned 
> integer. By saying e.g.
>    uint8 x:1;
> you're specifying the size twice, and perhaps it's not a surprise if you 
> get errors trying to compile it: which is it to be, 8 bits or 1?

Hmm. Looks like you're almost correct. I thought it worked so that if
you had:

uint8_t foo;
unsigned int bar:1;

That the bar would always allocate 32 bits more to the struct, but looks
like it doesn't at least with gcc.

There is however one difference:

struct a { uint8_t f1; uint8_t f2:1; }
struct b { uint8_t f1; unsigned int f2:1; }

sizeof(struct a) == 2 but sizeof(struct b) == 4

But this doesn't matter much. I don't think there's a single struct in
Dovecot's code that doesn't contain 32bit or 64bit fields.

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to