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

 

 

  Predict the output of the following program?

 1 #include<iostream>
 2 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 #include<iostream>
 2 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     else
17     {
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 #include<iostream>
 2 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     else
18     {
19         cout << "Fine " << endl;
20     }
21     return 0;
22 }

  Output:  Fine

  Now guess the output of following program (This is tricky).

 1 #include<iostream>
 2 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 #include <iostream>
 2 using namespace std;
 3   
 4 class Empty
 5 {
 6 };
 7   
 8 class Derived1 : public Empty
 9 {
10 };
11   
12 class Derived2 : virtual public Empty
13 {
14 };
15   
16 class Derived3 : public Empty
17 {    
18     char c;
19 };
20   
21 class Derived4 : virtual public Empty
22 {
23     char c;
24 };
25   
26 class Dummy
27 {
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 #include    <cstdio>
 2 #include    <iostream>
 3 using namespace std;
 4 class Test
 5 {
 6     int arr[0];
 7 };
 8 
 9 int main()
10 {
11     Test t;
12     cout<<sizeof(t);
13     return 0;
14 }

 

 

 

 

  Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

 


  转载请注明:http://www.cnblogs.com/iloveyouforever/

  2013-11-25  20:39:10

 

  

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/iloveyouforever/p/3442162.html