Inside The C++ Object Model (一)

本文对比了C与C++在空间和时间上的开销,并详细介绍了C++对象模型的三种模型:简单模型、表格驱动模型及C++对象模型。重点阐述了C++对象模型中的虚函数表(vtbl)与虚指针(vptr)机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

href="file:///C:/DOCUME~1/孤傲乾坤/LOCALS~1/Temp/msohtml1/01/clip_filelist.xml" rel="File-List" /> href="file:///C:/DOCUME~1/孤傲乾坤/LOCALS~1/Temp/msohtml1/01/clip_editdata.mso" rel="Edit-Time-Data" />

Inside The C++ Object Model

 

Chapter 1 关于对象(Object Lessons

CC++之间的开销对比

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;

}

ATTENTIONsizeof(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 functionsstatic member function non-static member function virtual function

C++内存模型如何表示这些成员呢?

1.       简单模型(A Simple Object Model

简单,便于编译器设计实现,赔上的是空间和时间效率,没有编译器实际采用,每个object是一系列slots,每个slots指向一个memberdata 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 memberobject内,static data memberclass的所有object外,static non-static member function也被放在所有object之外, virtual function分两步处理:

a.  每个class产生出一系列指向virtual function的指针, 这些指针放在一个表中, 叫做vtbl(虚函数表)。每个classtype_info object(用于支持runtime type identification RTTI)的指针放在vtbl的第一个slot中。

b.  classobject中多了一个vptr指针,他指向对应classvtblVptr的设置和清除发生在constructor destructor 以及 copy assignment动作中。

一个Object的大小

a.  non-static data member总和

b.  memory alignment,由编译器自动完成,可能存在member之间也可能存在集合体边界

c.  virtual机制带来的额外负担

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值