С размером вот этой простой структуры на x64 при выравнивании по умолчанию все понятно:
struct base {
void * m_ptr;
short m_sh;
char m_ch;
};
Вполне ожидаемо имеем 16 байт. Из которых реально используются 11, а остальное -- это выравнивание на границу 8 байт (т.к. указатель на 64-х битовых платформах занимает 8 байт).
А вот что с размером вот этой не менее простой структуры?
struct derived : public base {
char m_mask;
};
А вот тут сюрприз!
Результат зависит от компилятора: для VC++ получается 24 байта (и в этом есть некоторая логика), тогда как для GCC и clang -- 16 байт (и в этом также есть логика).
Но лично мне представляется, что логика GCC/clang как-то логичнее. Тогда как поведение VC++ стало неприятным открытием. Можно даже сказать как серпом...
Посмотреть самому можно на godbolt: https://godbolt.org/z/sbo8jPcxE