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 Size of empty class object。对于抽象类,对象存储了一个用于实现虚函数调用机制的指针。但是其他类对象(NotAbstrClass 和 MixClass)的大小呢?

4

3 回答 3

5

NotAbstrClass没有数据成员,所以它也是一个空类。由于类不能是零大小的,因此您将获得与EmptyClass.

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

于 2013-06-24T18:04:50.313 回答
3

根据 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
于 2015-06-05T19:16:04.607 回答
1

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

于 2013-06-24T18:03:44.680 回答