猿问

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

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

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

我用了一个小程序:

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

我在Visualc+和Cygwin-g+编译器上获得的输出是1字节!这让我有点惊讶,因为我期望它的大小是机器字(32位或4字节)。

有人能解释一下吗为什么一个字节的大小?好呀4个字节?这取决于编译器还是机器?另外,有人能给出一个更有说服力的理由来解释为什么一个空类对象不会大小为0字节?


幕布斯6054654
浏览 1057回答 3
3回答

慕斯709654

引文Bjarne Stroustrup的C+风格与技术常见问题,大小为非零的原因是“为了确保两个不同对象的地址不同”。大小可以是1,因为这里的对齐并不重要,因为实际上没有什么可看的。

翻翻过去那场雪

标准指出,所有大多数派生对象的size of()>=1:除非是位字段(class.bit),否则大多数派生对象都应该具有非零大小,并且占用一个或多个字节的存储空间。基类子对象的大小可能为零。ISO/IECFDIS 14882:1998(E)Intro.Object

胡子哥哥

这确实是一个实现细节。很久以前,我以为它可以是零字节,也可以是一千字节,因为它与语言规范没有关系。但是,在看了标准(第5.3.3节)之后,sizeof定义为始终返回一个或更大的值,无论发生什么。大多数派生类的大小应大于零。这是必需的,除其他外,允许您处理对象数组和指向它们的指针。如果您的元素被允许为零大小,那么&(array[0])将与&(array[42]),这将对您的处理循环造成各种各样的破坏。它可能不是机器单词的原因是,它中没有任何元素实际上需要在单词边界(例如整数)上对齐它。例如,如果你char x; int y;在类中,我的GCC将其时钟设置为8个字节(因为第二个int必须在该实现中对齐)。
随时随地看视频慕课网APP
我要回答