zoukankan      html  css  js  c++  java
  • 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

     

      

      

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    linux脚本启动停止一个jar
    如何突破各种防火墙的防护 [转]
    linux查看端口占用
    网页标题图标添加
    Go语言的一些使用心得
    kubernetes系列之ConfigMap使用方式
    Kubernetes因限制内存配置引发的错误
    Kubernetes系列之理解K8s Service的几种模式
    kubernetes中的Pause容器如何理解?
    Kubernetes系列之Helm介绍篇
  • 原文地址:https://www.cnblogs.com/iloveyouforever/p/3442162.html
Copyright © 2011-2022 走看看