Re: [dev] [st] [PATCH] Optimize memory footprint of line buffers

From: suigin <suigin_AT_national.shitposting.agency>
Date: Mon, 27 Apr 2015 07:34:01 -0700

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

This archive was generated by hypermail 2.3.0 : Mon Apr 27 2015 - 16:36:08 CEST