Size of C++ classes

34,067

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).

Share:
34,067
nurabha
Author by

nurabha

Updated on January 12, 2022

Comments

  • nurabha
    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
    nurabha almost 11 years
    The 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
    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
    nurabha almost 9 years
    who is girish shetty by the way ?
  • HappyTran
    HappyTran almost 9 years
    Girish Shetty is the author of the first paper link that I refer above. So, I give his name for reference. :)
  • turoni
    turoni over 2 years
    As 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.