类的学习笔记(一)

上课时,老师给我们了一个小例子,主要学习C++内存使用问题!

#include <iostream>

using namespace std;

class base

{

public:

   virtual void print()   

   {

      cout<<"********/n";

   }

};//base class has virtual function

class derived : public base

{

    public:

    virtual void print()

   {

      cout<<"========/n";

   }

};//derived from base

int main()

{

 base *p;

base a;

derived b;

p=&b;

p->print();//print: ========

cout<<"Size of a is "<<sizeof(a)<<endl;//ptint: Size of a is 4 

cout<<"Size of b is "<<sizeof(b)<<endl;//ptint: Size of b is 4

return 0;

}

//-----------------------------------------------------------------------------------------------------------------

对于一个class object,可能的内存开销是:

1-其non-static data member 的总合大小。

2--加上任何由alignment 的需求而填补(padding)上去的空间(可能存在于member 之间,也可能存在于集合体边界)

3---加上为了支持virtual 而由内部产生的任何额外负担(overhead)

--------引于《inside the c++ object model》

老师上课举例为:

class base

{

public:

   virtual void print()   

   {

      cout<<"********/n";

   }

};

这是一个仅含有一个virtual member function的类,该类需要维护一个指向虚表(virtual  table(vtbl))的虚指针(vptr),由于我的运行环境为32位,所以这个vptr 占据了4bytes。

那么如果是这样的类呢?

class A
{
public:
 void print()
 {
  cout<<"A CLASS/n";
 }
private:

};

这是一个仅含一个function member 的类,换句话说,这个类不需要维护一个指向vtbl的vptr。

然而 A a;

产生出来的对象实例a的大小依然不是0,而是1 bytes(在MS VC60中)。

这是因为为了防止两个对象实例占据同一块内存空间,(简单说,防止0 byte 大小的对象实例出现)编译器为 0 byte 大小的object 安插了一个char型的变量占位,有的编译器为了使总线达到最大传输效率,会把它对齐为4 bytes,即32位。

如果象这样,增加一个int型的nonstatic data member :

class A
{
public:
 void print()
 {
  cout<<"A CLASS/n";
 }
private:

   int value;

};

那么 A a;

得到a的大小是4 bytes而不是5 bytes。因为 a object 的大小不为零,不需要安插char型变量了。

为了验证以上内容,再举一个例子

class A
{
public:
 virtual void print()
 {
  cout<<"A CLASS/n";
 }
private:

  int value;

};

这个类有一个nonstatic data member 和一个virtual function member 的类,

那么 A a;

a的大小应该是多少呢?

呵呵,sizeof(a) 的结果是8 bytes

刚好印证了以上说法,4bytes 用于存放vptr,4bytes用于存放int 型 nonstatic data member.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值