Thursday, October 9, 2014

empty base class optimization: GCC vs MS visual studio



#include 
#include 
#include 
#include 
#include 
using std::cout;
using std::cin;
using std::endl;

class Base {
};
class Derived1:public Base {
 int i;
};
class Derived2:public Base {
public:
 Base b;
 int i;
};
class Derived3:public Base {
public:
 Derived1 d1;
 int i;
};

int main(int argc, char * argv[])
{
 cout << sizeof(Base) << endl;
 cout << sizeof(Derived1) << endl;
 /*Derived2 d2;
 cout << sizeof(d2) << endl;
 cout << &d2 << endl;
 cout << &d2.b << endl;
*/
 Derived3 d3;
 cout << sizeof(d3) << endl;

 return 0;
}

Different compilers produce different result.
MS gives 8 while GCC gives 12. This is a rare case I have ever experienced that MS beats GCC.