c++ sizeof 对象大小

本文通过实例演示了C++中类对象的大小是如何被计算的,包括非静态数据成员、虚函数指针以及对齐填充的影响,并展示了继承如何影响派生类的大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. #include <iostream>
  2. using namespace std;
  3. class Base
  4. {
  5. public:
  6.     Base(void);
  7.     virtual ~Base(void);
  8.     void f() { cout << "f()" << endl; }
  9. private:
  10.     int a;
  11.     char *p;
  12. };
  13. class Derived:public Base
  14. {
  15. public:
  16.     Derived(void);
  17.     ~Derived(void);
  18. private:
  19.     int b;
  20. };
  21. int main()
  22. {
  23.     cout << "Base: "<< sizeof(Base) << endl;
  24.     cout << "Derived: " << sizeof(Derived) << endl;
  25.     int c;
  26.     cin >> c;
  27.     
  28.     return 0;
  29. }

 输出:Base=12  Derived=16

 

然后我们去掉Base类中的virtual关键字。

输出:Base=8  Deruved=12

 

所以,sizeof类对象的大小包括:

1.非静态数据成员的大小(不包括静态数据成员,静态数据成员是全局的所有对象共享这个成员,而sizeof是:编译时,编译器计算出的栈空间大小)

2.如果类中有虚函数(无论有多少虚函数),则包括一个虚指针的大小(4)

3.类可能的边界对齐(32位机器是4的整数倍)


但是当存在继承关系,而子类中存在member data的时候,因为需要保持base class subobject 在derivaed class 中的原样性,所以继承类的对象大小会相应增大。

  1. #include <iostream>
  2. using namespace std;
  3. class Concrete{
  4. private:
  5.     int val;
  6.     char c1;
  7.     char c2;
  8.     char c3;
  9. };
  10. class Concrete1{
  11. private:
  12.     int val;
  13.     char bit1;
  14. };
  15. class Concrete2 : public Concrete1{
  16. private:
  17.     char bit2;
  18. };
  19. class Concrete3 : public Concrete2{
  20. private:
  21.     char bit3;
  22. };
  23. int _tmain(int argc, _TCHAR* argv[])
  24. {
  25.     Concrete obj1;
  26.     Concrete3 obj3;
  27.     cout << "Concrete obj " << sizeof(obj1) << endl;
  28.     cout << "Concrete3 obj " << sizeof(obj3) << endl;
  29.     return 0;
  30. }
输出: Concrete obj = 8
       Concrete3 obj = 16



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值