代码之家  ›  专栏  ›  技术社区  ›  Ashwin Nanjappa

C++:空类的对象的大小是多少?

  •  96
  • Ashwin Nanjappa  · 技术社区  · 17 年前

    空类的对象的大小 . 当然可以 应为0字节,因为它应该可以像任何其他对象一样引用和指向它。但是,这样一个物体有多大?

    #include <iostream>
    using namespace std;
    
    class Empty {};
    
    int main()
    {
        Empty e;
        cerr << sizeof(e) << endl;
        return 0;
    }
    

    在Visual C++和CygWig G+编译器上得到的输出是 1字节 ! 这让我有点惊讶,因为我希望它的大小和机器字一样(32位或4字节)。

    为什么? 1字节的大小? 不会 大小是否为0字节?

    16 回复  |  直到 17 年前
        2
  •  31
  •   Cheers and hth. - Alf    14 年前

    该标准规定,所有大多数派生对象都具有sizeof()>=1:

    除非是位字段(class.bit),否则最派生的对象应具有非零大小,并应占用一个或多个字节的存储空间。基类子对象的大小可能为零。 ISO/IEC FDIS 14882:1998(E) intro.object

        3
  •  17
  •   paxdiablo    5 年前

    expr.sizeof ), sizeof

    最派生类的大小应大于零。

    除其他外,这是允许您处理对象数组和指向它们的指针所必需的。如果您的元素被允许为零大小,那么 &(array[0]) 将与相同 &(array[42])

    它可能不是机器字的原因是,其中没有实际需要在字边界(例如整数)上对齐的元素。例如,如果您将 char x; int y; 在类内部,我的GCC将其时钟设置为8个字节(从第二个字节开始) int 必须在该实现中保持一致)。


    可能 不占用任何空间的对象。但是,该节增加了以下案文:

    应用于类时,结果是该类的对象中的字节数 包括在数组中放置该类型对象所需的任何填充。

    由于数组需要能够区分元素,这意味着 sizeof 必须返回至少一个,即使对象本身在技术上不占用空间。

    所以,措辞不同,但总体效果相同。

        4
  •  5
  •   lalatendu    13 年前

    尽管不需要为空类分配任何内存,但为了使对象成为空类,编译器分配可以分配的最小内存,即1字节。通过这种方式,编译器可以唯一地区分同一空类的两个对象,并且能够将对象的地址分配给空类类型的指针。

        5
  •  5
  •   Konstantin Nikitin    13 年前

    #include <iostream>
    
    class CompletlyEmpty {
      char NO_DATA[0];
    };
    
    int main(int argc, const char** argv) {
      std::cout << sizeof(CompletlyEmpty) << '\n';
    }
    
        6
  •  4
  •   Community Mohan Dere    9 年前

    我认为链接到一个解释这一好处的答案可能会有所帮助。 It is boost::compressed_pair 通过 Logan Capaldo .

        7
  •  3
  •   Peter O. Manuel Pinto    14 年前

    http://bytes.com/topic/c/insights/660463-sizeof-empty-class-structure-1-a

    空类或结构的大小为1

    标准,C++标准所说的一件事是“没有对象”。 内存中的地址应与任何其他变量相同“…什么 确保这一点最简单的方法是什么?确保所有类型都有一个 非零大小。为了实现这一点,编译器添加了一个伪字节 指向没有数据成员和虚拟对象的结构和类 然后保证它们具有唯一的内存地址。

        8
  •  2
  •   Yahya    16 年前

    为空类分配1字节取决于编译器。编译器需要确保对象驻留在不同的内存位置,并且需要为对象分配非零内存大小。 http://listenvoice.com/listenVoiceNote.aspx?id=27

    听听关于ListenVoice C++编程面试问题的空基础优化。

        9
  •  2
  •   Ramiz    15 年前

    类没有数据成员但大小为1字节的原因是* *必须存储在内存中,以便引用或指针可以指向该类的对象

        10
  •  0
  •   Ganesh    13 年前

    空类-该类不包含任何内容。

    任何不为空的类都将由其在内存中的内容表示。

    由于它没有内容,无法在内存中显示它的存在,但类存在,所以必须在内存中显示它的存在。 要在内存中显示空类,需要1个字节。

        11
  •  0
  •   lazarus    12 年前

    我认为这是因为1字节是可以用作占位符的最小内存单元,并且它不能给出零大小,因为不可能创建对象数组。。

    您所说的“这对我来说有点惊讶,因为我希望它的大小与机器字(32位或4字节)相同。”对于类型为empty()的引用变量(macine words),而不是类本身的大小(抽象数据类型),

        12
  •  0
  •   kidfisto    10 年前

    我认为这个问题只是理论上的问题,但在实践中并不重要。

    正如其他人已经指出的,从空类派生不会造成任何伤害,因为这不会为基类部分消耗任何额外的内存。

    此外,如果一个类是空的(从理论上讲,它不需要任何每实例内存,即它没有任何非静态数据成员或虚拟成员函数),那么它的所有成员函数也可以(并且应该)定义为静态的。因此,不需要创建此类的实例。

    一句话:如果您发现自己编写了一个空的类X,那么只需将所有成员函数设置为静态即可。这样就不需要创建X对象,派生类也不会受到任何影响。

        13
  •  0
  •   Sandeep_black    9 年前
    #include<iostream>
    using namespace std;
    
    
        class Empty { };
        int main()
        {
            Empty* e1 = new Empty;
            Empty* e2 = new Empty;
    
            if (e1 == e2)
                cout << "Alas same address of two objects" << endl;
            else
                cout << "Okay it's Fine to have different addresses" << endl;
    
            return 0;
        }
    

    返回大小1可确保两个对象的地址不相同。

        14
  •  0
  •   Yadvendra Yadav    9 年前

    它为非零,以确保两个不同的对象具有不同的地址。

        15
  •  0
  •   Disha Gugnani    5 年前

    对于空类的对象,编译器为唯一地址标识分配1个字节。因此,如果一个类有多个对象,它们可以有不同的唯一内存位置。假设,如果一个类没有任何大小,那么内存位置上会存储什么?这就是为什么在C++程序中创建空类对象时,它需要一些内存来存储,并且可以保留的最小内存量是1字节。因此,如果我们创建一个空类的多个对象,每个对象都有一个唯一的地址。

    int main()
    {
        EmptyClass obj1;
        EmptyClass obj2;
         
        if (&obj1 == &obj2){
             cout << "Both objects have same address" << endl;
        }else{
            cout << "Both objects have unique address" << endl;
        }       
        return 0;
    }
    
        16
  •  -2
  •   Jason Aller    11 年前

    我认为,如果一个空类的大小为零,则意味着它不存在。为了使它(类)存在,它需要至少有一个字节,因为这个字节是内存/引用地址。

        17
  •  -4
  •   Narayan das khatri    16 年前

    是因为 这