您的位置:首页 > 编程语言 > C语言/C++

C++ 类里面,函数占用存储空间问题

2014-02-24 12:31 267 查看
先看两段代码:

代码段1:

class A

{

public:

int print(){ cout<<"This is A"<<endl;}

};

inr main()

{

A a;

cout << "Size of A = " << sizeof(a) << endl;

}

输出结果:

Size of A =1

代码段2:

class A

{

public:

int print1(){ cout<<"This is A"<<endl;}

int print2(){ cout<<"This is A"<<endl;}

int print3(){ cout<<"This is A"<<endl;}

};

inr main()

{

A a;

cout << "Size of A = " << sizeof(a) << endl;

}

输出结果:

Size of A =1

对象的大小是它的数据成员所占存储空间之和,就和结构体一样。类中的函数是所有该类对象通用的方法,不算作对象的成员,因此也不算在对象的存储空间内

问题:类里面不管有多少个函数,这个类的对象只占1个字节的内存。这个字节的内存的内容是什么?是指针吗?指针不是占4个字节吗?

当类中类有定义任何变量的时候,类的对象都是1个字节的,当类中没有任何变量的时候,这个类里没有任何真正的成员变量,所以大小应该是0,但0大小不好在内存中定位一个地址,所以,就规定它大小为0的对象要占一字节空间,以便让它拥有一个合法的地址。如果是有派生类的,还有考虑到内存对齐的问题的。

另外涉及到虚函数的话又不一样了。如

class A

{

public:

virtual int print(){ cout<<"This is A"<<endl;}

};

如果sizeof(A)的话,得出的是4。

原因是涉及到虚函数的实现问题。

class Class1

{

m_data1;

m_data2;

virtual vfunc1()

virtual vfunc2()

virtual vfunc3()

};

Class1对象实例

vptr
m_data1
m_data2
通过vptr指针找到虚函数表

Vtable(虚函数表)
(*vfunc1)()
(*vfunc2)()
(*vfunc3)()
Class1::vfunc1()
Class1::vfunc2()
Class1::vfunc3()
所以回到原来的问题,A中只有一个或者几个虚函数的话,没有成员变量,那么类A相当于含有一个vptr指向虚函数表的指针,所以sizeof(A)=4。

还有一点,如

class B

{

};

class B2

{

};

class C:public B

{

};

class D:public virtual B

{

};

class E:public B,public B2

{

};

sizeof(B) = 1; sizeof(B2) = 1; sizeof(C) = 1; sizeof(D) = 4; sizeof(E) = 1;

空类所占空间为一(上文以解释),单一继承的空类空间也是1,多重继承的空类空间还是1,但是虚继承涉及到虚表(虚指针),所以sizeof(D)=4。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: