Inside The C++ Object Model
Chapter 1 关于对象(Object Lessons)
C和C++之间的开销对比
1. 空间
C++在使用了virtual机制时会造成额外的空间开销(vptr指针)
C++在使用继承时可能由于内存对齐问题导致比使用C技术要占用更多的存储空间
struct A
{
int x;
char c1;
int y;
char c2;
}
class X
{
int x;
char c1;
}
class Y: public X
{
int y;
char c2;
}
ATTENTION:sizeof(Y)不一定等于sizeof(A)
2. 时间
C++在使用virtual机制(virtual函数, virtual base class)时,以及多继承下由派生类向第二个以及后面的父类转换时,需要更多的开销
总之,像C一样使用的C++,由于不采用virtual机制及继承, 时空效率和C一样,运行效率可能更高(inline函数)。而C++可以使用ADT封装数据和算法,这从软件工程角度讲要强于C。
一般言之,并没有什么天生的理由说C++程序一定比其兄弟C庞大或迟缓。
C++对象模型
C++对象
两种data members: static member, non-static data member
三种member functions:static member function, non-static member function, virtual function
C++内存模型如何表示这些成员呢?
1. 简单模型(A Simple Object Model)
简单,便于编译器设计实现,赔上的是空间和时间效率,没有编译器实际采用,每个object是一系列slots,每个slots指向一个member(data or member function)。
2. 表格驱动模型(A Table-Driven Object Model)
这种模型对所有class的所有object有一致的表示,每个object有两个指针, 一个指向data table(存储数据成员),一个指向function table(存储成员函数)。该模型亦没有被实际采用,function table的观念和C++的实际模型中的vtbl是一样的。
3. C++对象模型(C++ Object Model)
由简单模型基础而来:non-static data member在object内,static data member在class的所有object外,static 和non-static member function也被放在所有object之外, virtual function分两步处理:
a. 每个class产生出一系列指向virtual function的指针, 这些指针放在一个表中, 叫做vtbl(虚函数表)。每个class的type_info object(用于支持runtime type identification, RTTI)的指针放在vtbl的第一个slot中。
b. 在class的object中多了一个vptr指针,他指向对应class的vtbl。Vptr的设置和清除发生在constructor, destructor 以及 copy assignment动作中。
一个Object的大小
a. non-static data member总和
b. memory alignment,由编译器自动完成,可能存在member之间也可能存在集合体边界
c. virtual机制带来的额外负担