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

     

      

      

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    c#数据绑定(3)——数据转化为信息
    c#数据绑定(2)——删除DataTable的数据
    C # 数据绑定(1)——将DataTabel的data添加ListView
    如何下载Chrome离线版EXE安装文件和MSI版安装文件
    Windows Installer (MSI) 详解 参数介绍
    7za.exe 命令行用法,参数介绍
    命令行启动Win7系统操作部分功能
    升级WordPress后开启友情链接管理模块
    如何将文件所有者改为TrustedInstaller
    开机自检时出现问题后会出现各种各样的英文短句解说
  • 原文地址:https://www.cnblogs.com/iloveyouforever/p/3442162.html
Copyright © 2011-2022 走看看