• 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

     

      

      

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    【python-plt】二元正态密度函数图像
    【python-plt】一元正态分布图像
    【7】极大似然估计与贝叶斯估计
    实变函数【1】集合
    图形学-心得
    分布式网络架构
    shader的内置变量
    图形学-绘制
    python加载图片
    linux下批量删除utf8 bom
  • 原文地址:https://www.cnblogs.com/iloveyouforever/p/3442162.html
Copyright © 2020-2023  润新知