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

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

1 代码

#include
using namespace std;
class CBox{
    int foo();
};
int main(){
    CBox boxobj;
    cout<

2 运行

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

3 说明

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

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

1 代码

#include
using namespace std;
class CBox{
public:
    CBox(){};
    ~CBox(){};
};
int main(){
    CBox boxobj;
    cout<

2 运行

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

3 说明

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

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

1 代码

#include
using namespace std;
class CBox{
public:
    CBox(){};
    virtual ~CBox(){};
};
int main(){
    CBox boxobj;
    cout<

2 运行

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

3 说明

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

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

1 代码

#include
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):"<

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个不同的函数代码段。

你可能感兴趣的:(C++,C++)