Size of C++ classes
Solution 1
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.
Solution 2
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
Solution 3
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).
nurabha
Updated on January 12, 2022Comments
-
nurabha over 2 years
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) ?
-
nurabha almost 11 yearsThe static data member of MixClass is part of class namespace, shared by all objects of the class but is not part of class object. Is that why it doesn't contribute to size of the MixClass object ?
-
Praetorian almost 11 years@nurabha You answered it yourself. The static data member is shared between all instances of that class, and as such it doesn't belong to any individual instance. If it's not part of any instance, how can it add to the size of one?
-
nurabha almost 9 yearswho is girish shetty by the way ?
-
HappyTran almost 9 yearsGirish Shetty is the author of the first paper link that I refer above. So, I give his name for reference. :)
-
turoni over 2 yearsAs a warning, the link of the memory layout currently goes to a website that my antivirus complains about. But seemingly the question cannot be edited.