C++类的大小

Size of C++ classes

本文关键字:C++      更新时间:2023-10-16

这是打印不同类别大小的代码

#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;
}

C++11编译器上程序的输出是

Size of empty class: 1
Size of Abstract class :4
Size of Non Abstract class: 1
Size of Mix class: 8

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

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

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

根据Girish Shetty:

在C++中,有许多因素决定类的对象的大小。

这些因素是:

  • 所有非静态数据成员的大小
  • 数据成员的顺序
  • 字节对齐或字节填充
  • 其直接基类的大小
  • 虚拟函数的存在(使用虚拟函数的动态多态性)
  • 正在使用的编译器
  • 继承模式(虚拟继承)

这里有一些相关的网站,我认为它可以对你有所帮助。

确定类对象的大小:http://www.cprogramming.com/tutorial/size_of_class_object.html

内存布局:http://www.phpcompiler.org/articles/virtualinheritance.html

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

cl -d1reportAllClassLayout main.cpp
当我们谈论比特大小时,NotAbstratrClass就像一个空类,因为它没有数据。MixClass有一个虚拟函数指针(在32位机器上为4字节)和一个int(也是4字节)。
相关文章:
  • 没有找到相关文章