Predict the output of the following program?
1 #include2 using namespace std; 3 4 class Empty 5 { 6 }; 7 8 int main() 9 {10 cout << sizeof(Empty) << endl;11 return 0;12 }
Output: 1
Size of an empty class is not zero. It is 1 byte generally. It is non-zero to ensure that the two different objects will have different addresses.
See the following example.
1 #include2 using namespace std; 3 4 class Empty 5 { 6 }; 7 8 int main() 9 {10 Empty a, b;11 12 if (&a == &b)13 {14 cout << "impossible " << endl;15 }16 else17 {18 cout << "Fine " << endl;19 }20 21 return 0;22 }
Output: Fine
For the same reason (different objects should have different addresses), “new” always returns pointers to distinct objects.
See the following example.
1 #include2 using namespace std; 3 4 class Empty 5 { 6 }; 7 8 int main() 9 {10 Empty* p1 = new Empty;11 Empty* p2 = new Empty;12 13 if (p1 == p2)14 {15 cout << "impossible " << endl;16 }17 else18 {19 cout << "Fine " << endl;20 }21 return 0;22 }
Output: Fine
Now guess the output of following program (This is tricky).
1 #include2 using namespace std; 3 4 class Empty 5 { 6 }; 7 8 class Derived: Empty 9 { 10 int a; 11 };12 13 int main()14 {15 cout << sizeof(Derived);16 return 0;17 }
Output (with GCC compiler): 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 excercise, try the following program on your compiler.
1 #include2 using namespace std; 3 4 class Empty 5 { 6 }; 7 8 class Derived1 : public Empty 9 {10 };11 12 class Derived2 : virtual public Empty13 {14 };15 16 class Derived3 : public Empty17 { 18 char c;19 };20 21 class Derived4 : virtual public Empty22 {23 char c;24 };25 26 class Dummy27 {28 char c;29 };30 31 int main()32 {33 cout << "sizeof(Empty) " << sizeof(Empty) << endl;34 cout << "sizeof(Derived1) " << sizeof(Derived1) << endl;35 cout << "sizeof(Derived2) " << sizeof(Derived2) << endl;36 cout << "sizeof(Derived3) " << sizeof(Derived3) << endl;37 cout << "sizeof(Derived4) " << sizeof(Derived4) << endl; 38 cout << "sizeof(Dummy) " << sizeof(Dummy) << endl;39 40 return 0;41 }
运行结果如下所示。
补充:
运行如下代码,运行结果为: 1
1 #include2 #include 3 using namespace std; 4 class Test 5 { 6 int arr[0]; 7 }; 8 9 int main()10 {11 Test t;12 cout<
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
转载请注明:
2013-11-25 20:39:10