C++对象的各方法存储空间占用计算

一 类中只有1个成员函数的存储空间计算

1 代码

#include<iostream>
using namespace std;
class CBox{
    int foo();
};
int main(){
    CBox boxobj;
    cout<<sizeof(boxobj)<<endl;
    return 0;
}

2 运行

[root@localhost charpter02]# g++ 0217.cpp -o 0217
[root@localhost charpter02]# ./0217
1

3 说明

CBox类中只有一个成员函数,类CBox的对象大小boxobj的大小却只有1Byte,和空对象是一样的,所以可以得出,成员函数是不占空间的。

二 类中构造函数和析构函数的存储空间计算

1 代码

#include<iostream>
using namespace std;
class CBox{
public:
    CBox(){};
    ~CBox(){};
};
int main(){
    CBox boxobj;
    cout<<sizeof(boxobj)<<endl;
    return 0;
}

2 运行

[root@localhost charpter02]# g++ 0218.cpp -o 0218
[root@localhost charpter02]# ./0218
1

3 说明

类CBox中只有构造函数和析构函数,类CBox的对象boxobj的大小也只有1Byte,和空类对象一样的,所以可以得出,构造函数和析构函数也是不占空间的。

三 类中有虚的析构函数的空间计算

1 代码

#include<iostream>
using namespace std;
class CBox{
public:
    CBox(){};
    virtual ~CBox(){};
};
int main(){
    CBox boxobj;
    cout<<sizeof(boxobj)<<endl;
    return 0;
}

2 运行

[root@localhost charpter02]# g++ 0219.cpp -o 0219
[root@localhost charpter02]# ./0219
8

3 说明

类CBox中有1个构造函数和1个虚的析构函数,程序的执行结果是8.事实上,编译器为了支持虚函数,会产生额外的负担,这正是指向虚函数表的指针的大小。(指针变量在64位的机器上占8bytes)。如果一个类中有一个或多个虚函数,没有成员变量,那么类相对于含有一个指向虚函数表的指针,占8Byte。

四 继承空类和多重继承空类存储空间的计算

1 代码

#include<iostream>
using namespace std;
class A{
};
class B{
};
class C:public A{
};
class D:public virtual B{
};
class E:public A,public B{
};
int main(){
    A a;
    B b;
    C c;
    D d;
    E e;
    cout<<"sizeof(a):"<<sizeof(a)<<endl;
    cout<<"sizeof(b):"<<sizeof(b)<<endl;
    cout<<"sizeof(c):"<<sizeof(c)<<endl;
    cout<<"sizeof(d):"<<sizeof(d)<<endl;
    cout<<"sizeof(e):"<<sizeof(e)<<endl;
    return 0;
}

2 运行

[root@localhost charpter02]# g++ 0220.cpp -o 0220
[root@localhost charpter02]# ./0220
sizeof(a):1
sizeof(b):1
sizeof(c):1
sizeof(d):8
sizeof(e):1

3 说明

单一继承的空类空间也是1,多重继承的空类空间还是1,但是虚继承涉及虚表(虚指针),所以sizeof(d)=8。

综上,每个对象所占用的存储空间只有该对象的非静态数据成员的总和,其他都不占用存储空间,包括成员函数和静态数据成员。函数代码是存储在对象空间之外的。而且,函数代码段是公用的,即如果对同一类定义了10个对象,这些对象的成员函数对应的是同一函数代码段,而不是10个不同的函数代码段。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值