On Mon, Apr 27, 2015 at 10:29:25AM +0200, Roberto E. Vargas Caballero wrote:
> > typedef struct {
> > uint_least32_t u;
> > uint_least32_t mode:12;
> > uint_least32_t fg:10;
> > uint_least32_t bg:10;
> > } Glyph;
>
> The size of this struct is only one byte less than if the
> same of the struct using shorts. You can test it if you
> want.
I'm attaching a test program I just wrote. It has three different
versions of the Glyph struct, including one using ``long'' to
store the UTF-32 character. The output of that program when compiled
with GCC 4.8.4 on my x86_64 machine is the following:
>$ gcc -std=c99 -o sizeofglyph sizeofglyph.c
>$ ./sizeofglyph
>sizeof(Glyph): 10 bytes
>sizeof(GlyphUtf32): 16 bytes
>sizeof(GlyphUtf32Packed): 8 bytes
As you can see, it's actually 2 bytes less. This is because a struct
is usually aligned to the maximum alignment of all fields. A 16-bit
ushort has a 2-byte alignment on x86_64, so this forces the struct
to also have an alignment of 2-bytes, and thus it has to insert two
extra padding bytes at the end of the struct to maintain the alignment
across an array of these structs.
Now, 2 bytes isn't a big deal if its isolated, but if you do the math,
for a terminal with 240 columuns and 120 rows, including the alternate
screen buffer, that's 2 * 240 * 120 * 2 = 115,200 bytes that are being
wasted--nearly 128KB--which is significant.
Received on Mon Apr 27 2015 - 16:34:01 CEST