C++ C+的大小+;班级

C++ C+的大小+;班级,c++,class,object,sizeof,C++,Class,Object,Sizeof,下面是打印不同类大小的代码 #include <iostream> using namespace std; class EmptyClass { }; class AbstractClass { public: virtual void funcOne() = 0; virtual void funcTwo() = 0; }; class NotAbstrClass { public: int virtFunc( i

下面是打印不同类大小的代码

#include <iostream>

using namespace std;

class EmptyClass
{    
};

class AbstractClass
{
  public: 
          virtual void funcOne() = 0;
          virtual void funcTwo() = 0;
};

class NotAbstrClass
{
  public: int virtFunc( int );
};

class MixClass
{
  public:
          virtual void clFunc( int );
          static int i;
          int j;
};

int main()
{
    // Print size of class or class objects
    cout<<"Size of empty class: "<< sizeof(EmptyClass)<<endl;          
    cout<<"Size of Abstract class :"<< sizeof(AbstractClass)<<endl;
    cout<<"Size of Non Abstract class: "<< sizeof(NotAbstrClass)<<endl;
    cout<<"Size of Mix class: "<< sizeof(MixClass)<<endl;
    return 0;
}

我理解为什么空课有1号。对于抽象类,对象存储用于实现虚拟函数调用机制的指针。但是其他类对象(NotAbstrClass和MixClass)的大小呢?

当我们谈论位大小时,NotAbstrClass就像一个空类,因为它没有数据。
MixClass有虚拟函数指针(32位机器上有4个字节)和int(也有4个字节)。

NotAbstrClass
没有数据成员,因此它也是一个空类。由于类的大小不能为零,因此您将得到与
EmptyClass
相同的处理


MixClass
有一个虚拟函数和一个非静态数据成员。似乎每个(
vptr
int
)在您的平台上占用4个字节,因此大小为8个字节。

根据Girish Shetty的说法:

在C++中,有很多因素决定了一个类的对象大小。 这些因素包括:

  • 所有非静态数据成员的大小
  • 数据成员的顺序
  • 字节对齐或字节填充
  • 其直接基类的大小
  • 虚函数的存在(使用虚函数的动态多态性)
  • 正在使用的编译器
  • 继承方式(虚拟继承)
这里有一些相关的网站,我想它会对你有所帮助

确定类对象的大小:

内存布局:

而且,如果使用MVSC,您可以使用
-d1reportAllClassLayout
转储解决方案中所有类的所有内存布局,如下所示:

cl -d1reportAllClassLayout main.cpp

请理解sizeof()告诉您的任何内容都与特定操作系统中的特定编译器和这些特定设置有着内在的依赖关系。@SebastianRedl:您是对的。但目前我正在考虑使用32位桌面处理器体系结构,使用32位操作系统。在这种情况下,您可以使用具体的值来表示整数类型(4字节)和指针类型(4字节)的大小。重复的我知道这是一个愚蠢的问题,当我在一家半导体公司的采访中被问到这类问题时,我也有同样的想法。MixClass的静态数据成员是类命名空间的一部分,由类的所有对象共享,但不是类对象的一部分。这就是为什么它不会影响MixClass对象的大小吗?@nurabha你自己回答的。静态数据成员在该类的所有实例之间共享,因此它不属于任何单个实例。如果它不是任何实例的一部分,它如何能增加一个的大小?顺便问一下,谁是girish shetty?girish shetty是我上面提到的第一个论文链接的作者。因此,我给出他的名字以供参考。:)
cl -d1reportAllClassLayout main.cpp