@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.
  • Вопрос задан
  • 119 просмотров
Решения вопроса 1
@vabka
Токсичный
12 байт не кратно 8, по тому компилятор добавил ещё 4 байта, чтобы выровнять до 16.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
The AnyLogic Company Санкт-Петербург
от 180 000 ₽
ITC Solutions Севастополь
от 120 000 ₽
KTS Москва
от 140 000 до 200 000 ₽
05 мар. 2021, в 20:30
5000 руб./за проект
05 мар. 2021, в 20:08
1000 руб./за проект
05 мар. 2021, в 18:46
10000 руб./за проект