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()
};
所以回到原来的问题,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。
代码段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对象实例
|
Vtable(虚函数表)
|
|
还有一点,如
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。
相关文章推荐
- EASY_ZJU_PAT ADVANCED LEVEL_1031 仔细分析,删繁就简
- c语言内存分配方式
- c语言结构体用法
- effective C++
- 查找最小的k个元素 C++实现
- 我的vc++6.0编译的时候没有问题,运行的时候为什么总是报告一个错误?
- 2013华为机试字符串压缩
- 深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换
- C语言函数申明关键字inline
- hdoj1020--Encoding
- C++函数高级特征
- C,C++基础和编程风格(2)
- C,C++基础和编程风格(1)
- 深入理解C语言-----各数据类型大小
- 常问的CC++基础题
- hdu 2047
- 用 Boost.extension 做C/C++插件
- 【深入探索c++对象模型】C++新手的两种常见误解
- c语言快速排序法
- C++中cout和cerr的区别