С размером вот этой простой структуры на 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
Очередная подстава от C++ :). А если делать наследование «C-шным» способом:
ОтветитьУдалить----------------
struct derived {
base m_base;
char m_mask;
};
----------------
то тогда у всех 3-ёх компиляторов получается одинаково:
----------------
sizeof(base): 16
sizeof(derived): 24
----------------