In the following code, why is the size of Parent the same as the size of Child (even though Child adds a member variable)? Another weird behaviour: if I comment out the line where b is defined, the size of Child stays the same, but if I add another variable (int b, c;) then sizeof gives 24. An explanation of why this happens would be greatly appreciated (:
#include <iostream>
class Parent {
int a = 0;
public:
virtual void foo() {}
};
class Child : public Parent {
int b; // this line doesn't affect the output
};
int main() {
std::cout << sizeof(Parent) << ", " << sizeof(Child);
return 0;
}
// Output is : 16, 16
NB : this is my first time asking questions here so feel free to ask me to edit it if it is unclear or poorly formulated.
Thank you all for your answers/comments, I think @Peter's answer explains it well : this is due to the 8 byte alignment required by the virtual function (on my system at least). So interestingly, without the virtual function :
class Parent
{
int a = 0;
public:
// virtual void foo() {}
};
The result of alignof(Parent)
is 4
, and so any single int
variable will make a difference in the result of sizeof
, but with the virtual function :
class Parent
{
int a = 0;
public:
virtual void foo() {}
};
alignof(Parent)
now gives 8
, so it would take two more int
variables to change the result of sizeof
.