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.