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

C++ C++;:空类的对象的大小是多少?,c++,class,object,C++,Class,Object,我想知道空类对象的大小是多少。它肯定不能是0字节,因为它应该可以像任何其他对象一样引用和指向它。但是,这样一个物体有多大 我用了这个小程序: #include <iostream> using namespace std; class Empty {}; int main() { Empty e; cerr << sizeof(e) << endl; return 0; } #包括 使用名称空间std; 类空{}; int mai

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

我用了这个小程序:

#include <iostream>
using namespace std;

class Empty {};

int main()
{
    Empty e;
    cerr << sizeof(e) << endl;
    return 0;
}
#包括
使用名称空间std;
类空{};
int main()
{
空e;

cerr这实际上是一个实现细节。很久以前,我曾经认为它可能是零字节或1000字节,这与语言规范没有关系。但是,在查看了C++17标准(
expr.sizeof
)之后,
sizeof
被定义为总是返回一个或多个字节,不管怎样

最派生类的大小应大于零

这是允许处理对象数组和指向它们的指针所必需的。如果允许元素的大小为零,则
&(数组[0])
将与
&(数组[42])
相同,这将对处理循环造成各种破坏

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


话虽如此,该特定措辞似乎已从C++20中删除,至少允许对象不占用任何空间。但是,以下文本已添加到该部分:

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

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


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

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

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


引用,大小不为零的原因是“为了确保两个不同对象的地址不同。”大小可以是1,因为在这里对齐并不重要,因为实际上没有什么可看的。

我认为链接到解释这一点的答案可能也会有帮助。关于。

为空类分配1字节取决于编译器。编译器需要确保对象驻留在不同的内存位置,并且需要为对象分配非零内存大小。 请在此处收听有关此主题的笔记:

即使编译器将非零大小分配给空类,当从空类派生新类时,它们也会进行优化。
关于ListenVoice C++编程面试问题的空基础优化。

是因为<强> > <强>指针,虽然指针为(整数)4字节,但引用。


一个1字节的单内存位置(一个单元)。

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

这可能有助于u:-)

空类或结构的大小为1

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


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

有一个例外:0长度数组

#include <iostream>

class CompletlyEmpty {
  char NO_DATA[0];
};

int main(int argc, const char** argv) {
  std::cout << sizeof(CompletlyEmpty) << '\n';
}
#包括
类完全空{
字符无_数据[0];
};
int main(int argc,常量字符**argv){

std::cout空类-该类不包含任何内容

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

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

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


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

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

我认为这个问题只在理论上有意义,但在实践中无关紧要

正如其他人已经指出的,从空类派生不会有任何伤害,因为这将
#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;
    }
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;
}