Course Curriculum

Why is the size of an empty class not zero in C++?

Why is the size of an empty class not zero in C++?

When structure is introduced in C, that time there is no concept of Object. So According to C standard it is decided to keep zero size of empty structure in C programming only. In C++, Size of empty structure/class will be one byte as because to call function at least empty structure should have some size ( minimum 1 byte is required ) i.e. one byte. The same happens with the Classes as well they must require One byte of memory to make them distinguishable.

The Code below shows the Size of Empty Class-

CPP

#include<iostream>
using namespace std;
//Creating a Empty Class
class Empty_class
{
};
// main starts
int main()
{
cout <<"Size of Empty Class is = "<< sizeof(Empty_class);
return 0;
}
Output
Size of Empty Class is = 1

Size of an empty class is not zero. It is 1 byte generally. It is nonzero to ensure that the two different objects will have different addresses. See the following example.

CPP

#include<iostream>
using namespace std;

class Empty { };

int main()
{
Empty a, b;

if (&a == &b)
cout << "impossible " << endl;
else
cout << "Fine " << endl;

return 0;
}
Output

Fine

  • For the same reason (different objects should have different addresses), “new” always returns pointers to distinct objects. See the following example.

CPP

#include<iostream>
using namespace std;

class Empty { };

int main()
{
Empty* p1 = new Empty;
Empty* p2 = new Empty;

if (p1 == p2)
cout << "impossible " << endl;
else
cout << "Fine " << endl;

return 0;
}
Output
Fine
Now guess the output of following program (This is tricky)

CPP

#include<iostream>
using namespace std;

class Empty { };

class Derived: Empty { int a; };

int main()
{
cout << sizeof(Derived);
return 0;
}
Output
4

Note that the output is not greater than 4. There is an interesting rule that says that an empty base class need not be represented by a separate byte. So compilers are free to make optimization in case of empty base classes. As an exercise, try the following program on your compiler.

CPP

// Thanks to Venki for suggesting this code.
#include <iostream>
using namespace std;

class Empty {
};

class Derived1 : public Empty {
};

class Derived2 : virtual public Empty {
};

class Derived3 : public Empty {
char c;
};

class Derived4 : virtual public Empty {
char c;
};

class Dummy {
char c;
};

int main()
{
cout << "sizeof(Empty) " << sizeof(Empty) << endl;
cout << "sizeof(Derived1) " << sizeof(Derived1) << endl;
cout << "sizeof(Derived2) " << sizeof(Derived2) << endl;
cout << "sizeof(Derived3) " << sizeof(Derived3) << endl;
cout << "sizeof(Derived4) " << sizeof(Derived4) << endl;
cout << "sizeof(Dummy) " << sizeof(Dummy) << endl;

return 0;
}
Output
sizeof(Empty) 1
sizeof(Derived1) 1
sizeof(Derived2) 8
sizeof(Derived3) 1
sizeof(Derived4) 16
sizeof(Dummy) 1

Can a C++ class have an object of self type? (Prev Lesson)
(Next Lesson) Static data members in C++