First off, a virtual function is not a pointer with 8 bytes. In C++ nothing but sizeof(char)
is guaranteed to be any number of bytes.
Second, only the first virtual function in a class increases its size (compiler-dependent, but on most - if not all - it's like this). All subsequent methods do not. Non-virtual functions do not affect the class's size.
This happens because a class instance doesn't hold pointers to methods themselves, but to a virtual function table, which is one per class.
So if you had:
class A
{
virtual void foo();
}
and
class B
{
virtual void goo();
virtual void test();
static void m();
void x();
}
you would have sizeof(A) == sizeof(B)
.
And now:
Why siszeof(A) is 1 and sizeof(C) is 1 too ?
A
and C
have size 1 just because it's not allowed for a class to be of size 0. The functions have nothing to do with it. It's just a dummy byte.
Why siszeof(H) is 16 but sizeof(G) is 4 ?
G
has only one member that accounts for memory - the int
. And on your platform, sizeof(int) == 4
. H
, besides the int
, also has a pointer to the vftable
(virtual function table, see above). The size of this, size of int and allignment are compiler specific.
Why siszeof(E) is 16 but sizeof(F) is 4 ?
Explained above - non virtual methods don't take up memory in the class.
Why siszeof(D) is 8 but sizeof(E) is 16 ?
D
only contains the vftable
pointer which is apparently 8 bytes on your platform. E
also has an int, and the vftable
is aligned to 8 bytes. So it's something like:
class E
4 bytes for int | 4 padding bytes | 8 bytes for vftable pointer |
| x | x | x | x | | | | | v | v | v | v | v | v | v | v |
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…