#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. |