首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++:空类的对象的大小是多少?

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

Stack Overflow用户
提问于 2009-03-07 10:06:50
回答 17查看 69.7K关注 0票数 115

我想知道一个空类的对象的大小是多少。它肯定不能是0字节,因为它应该可以像任何其他对象一样引用和指向它。但是,这样的物体有多大呢?

我使用了这个小程序:

代码语言:javascript
运行
复制
#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字节大小?

EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2009-03-07 10:36:31

引用Bjarne Stroustrup's C++ Style and Technique FAQ的话说,大小不为零的原因是“为了确保两个不同对象的地址不同”。大小可以是1,因为对齐在这里并不重要,因为实际上没有什么需要查看的。

票数 135
EN

Stack Overflow用户

发布于 2009-03-07 10:27:57

标准规定所有的派生对象都有sizeof() >= 1:

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

票数 31
EN

Stack Overflow用户

发布于 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必须返回至少一个元素,即使对象本身在技术上没有占用空间。

因此,措辞不同,但总体效果相同。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/621616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档