Может кто-нибудь, пожалуйста, объясните результаты, возвращаемые 'sizeof' в этом коде - PullRequest
0 голосов
/ 03 июня 2018

Я не берусь за вывод, показанный ниже.

Я знаю, что всякий раз, когда присутствует виртуальная функция, она создает vptr, но все же напечатанный размер больше, чем я ожидал:

#include<iostream>
using namespace std; 

class Base
{
 int x;
 int y;
 int z;
public:
 virtual void fun(){}
 virtual void fun2(){}
};

class Derived:public Base
{
 public:
  void fun() override {} 
};

int main(int argc, char const *argv[])
{
  cout<<sizeof(Base)<<endl;
  cout<<sizeof(Derived)<<endl;
  cout<<sizeof(int)<<endl; 
}

24
24
4
[Закончено за 0,3 с]

1 Ответ

0 голосов
/ 03 июня 2018

Это 64-битная сборка?Если это так, sizeof Base будет:

8 (указатель виртуальной таблицы) + (3 * 4 = 12) (переменные-члены) + 4 (добавление к кратному 8 байтам) = 24

Так как Derived происходит только от Base и не добавляет переменных-членов, его размер одинаков.

Почему добавляется дополнение?Для поддержания 8-байтового выравнивания в массивах и в стеке.Почему это важно?Это другой вопрос .

...