我想知道一个空类的对象的大小是多少。它肯定不能是0字节,因为它应该可以像任何其他对象一样引用和指向它。但是,这样的物体有多大呢?
我使用了这个小程序:
#include <iostream>
using namespace std;
class Empty {};
int main()
{
Empty e;
cerr << sizeof(e) << endl;
return 0;
}
我在Visual C++和Cygwin-g++编译器上得到的输出是1byte!这让我有点惊讶,因为我期望它是机器字的大小(32位或4字节)。
谁能解释一下为什么是1字节的大小?为什么不是4字节?这是否也依赖于编译器或机器?另外,有没有人能给出一个更有说服力的理由来解释为什么一个空类对象不会是0字节大小?
发布于 2009-03-07 10:36:31
引用Bjarne Stroustrup's C++ Style and Technique FAQ的话说,大小不为零的原因是“为了确保两个不同对象的地址不同”。大小可以是1,因为对齐在这里并不重要,因为实际上没有什么需要查看的。
发布于 2009-03-07 10:27:57
标准规定所有的派生对象都有sizeof() >= 1:
除非是位字段(class.bit),否则最大派生对象应具有非零大小,并应占用一个或多个字节的存储空间。基类子对象的大小可以为零。ISO/IEC FDIS 14882:1998(E) intro.object
发布于 2009-03-07 10:09:00
这确实是一个实现细节。很久以前,我认为它可能是零字节,也可能是1000字节,这与语言规范无关。但是,在研究了C++17标准(expr.sizeof
)之后,sizeof
被定义为无论什么情况都总是返回1或更多。
大多数派生类的大小应大于零。
这对于允许您处理对象数组和指向它们的指针是必需的。如果您的元素被允许为零大小,那么&(array[0])
将与&(array[42])
相同,这将对您的处理循环造成各种破坏。
它可能不是机器字的原因是,其中没有实际要求它在字边界(如整数)上对齐的元素。例如,如果您将char x; int y;
放在类中,我的GCC将其计时为8个字节(因为在该实现中第二个int
必须对齐)。
话虽如此,这个特定的措辞似乎已经从C++20中删除了,至少允许对象不占用空间的可能性。但是,已将以下文本添加到该部分:
当应用于类时,结果是该类的对象中的字节数,包括将该类型的对象放入数组所需的填充。
由于数组需要能够区分不同的元素,这意味着sizeof
必须返回至少一个元素,即使对象本身在技术上没有占用空间。
因此,措辞不同,但总体效果相同。
https://stackoverflow.com/questions/621616
复制相似问题