@Eugene-123

Откуда взялись дополнительные 4 байта?

Откуда взялись дополнительные 4 байта?
struct Something {
    int some_field {};
    virtual void SomeMethod() {}
};

int main() {
    // Размер и выравнивание vptr
    std::cout << "sizeof(void*) = " << sizeof(void*) << std::endl;
    std::cout << "alignof(void*) = " << alignof(void*) << std::endl;

    // Размер и выравнивание поля
    std::cout << "sizeof(int) = " << sizeof(int) << std::endl;
    std::cout << "alignof(int) = " << alignof(int) << std::endl;

    // Размер и выравнивание структуры
    std::cout << "sizeof(Something) = " << sizeof(Something) << std::endl;
    std::cout << "alignof(Something) = " << alignof(Something) << std::endl;

    return 0;
}

Пишет:
sizeof(void*) = 8
alignof(void*) = 8
sizeof(int) = 4
alignof(int) = 4
sizeof(Something) = 16 ???
alignment(Something) = 8


Не понятно откуда еще 4 байта взялось, ведь размер vptr 8 байт, а поля some_filed - 4 байта, т.е.: 8 + 4 = 12 != 16. Если это связано с выравниванием, то все равно не понятно, ведь int размещается на адресах кратных 4, там не должно быть padding'a.
P.S. Компилятор msys64\...\clang.exe. Компиляция в режиме Debug.
  • Вопрос задан
  • 153 просмотра
Решения вопроса 1
vabka
@vabka
Токсичный шарпист
12 байт не кратно 8, по тому компилятор добавил ещё 4 байта, чтобы выровнять до 16.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы