Here is the code which prints size of different classes
#include <iostream>
using namespace std;
class EmptyClass
{
};
class AbstractClass
{
public:
virtual void funcOne() = 0;
virtual void funcTwo() = 0;
};
class NotAbstrClass
{
public: int virtFunc( int );
};
class MixClass
{
public:
virtual void clFunc( int );
static int i;
int j;
};
int main()
{
// Print size of class or class objects
cout<<"Size of empty class: "<< sizeof(EmptyClass)<<endl;
cout<<"Size of Abstract class :"<< sizeof(AbstractClass)<<endl;
cout<<"Size of Non Abstract class: "<< sizeof(NotAbstrClass)<<endl;
cout<<"Size of Mix class: "<< sizeof(MixClass)<<endl;
return 0;
}
The output of the program on C++11 compiler is
Size of empty class: 1
Size of Abstract class :4
Size of Non Abstract class: 1
Size of Mix class: 8
I understand why Empty class has size 1 Size of empty class object. For abstract class, the object stores a pointer for implementing virtual function call mechanisms. But what about the sizes of other class objects (NotAbstrClass and MixClass) ?
According to Girish Shetty:
There are many factors that decide the size of an object of a class in C++.
These factors are:
- Size of all non-static data members
- Order of data members
- Byte alignment or byte padding
- Size of its immediate base class
- The existence of virtual function(s) (Dynamic polymorphism using virtual functions).
- Compiler being used
- Mode of inheritance (virtual inheritance)
Here there are some related website, I think it can be helpful to you.
Determine the size of class object: http://www.cprogramming.com/tutorial/size_of_class_object.html
Memory layout: http://www.phpcompiler.org/articles/virtualinheritance.html
And, if you use MVSC, you can dump all memory layout of all class in your solution with -d1reportAllClassLayout
like that:
cl -d1reportAllClassLayout main.cpp
NotAbstrClass
has no data members, so it too is an empty class. Since classes cannot be zero-sized, you get the same treatment as EmptyClass
.
MixClass
has a virtual function, and 1 non-static data member. It seems each of these (vptr
and int
) occupy 4 bytes on your platform, so the size is 8 bytes.
NotAbstrClass is like an empty class when we talk about bit sizes since it has no data. MixClass has the virtual function pointer (4 bytes on a 32-bit machine) and an int (also 4 bytes).
来源:https://stackoverflow.com/questions/17281932/size-of-c-classes