爱技术 & 爱分享
爱蛋蛋 & 爱生活

C++相对于C的布局成本

这篇文章,主要是先介绍一下 C++相对于C来说,在何处的布局成本上会有额外的开销。
详细分析请看本系列之后的文章。

与C的差异

在C语言中,“数据”的处理数据的操作(函数)是分开声明的,也就是说,语言本身并没有支持“数据和函数”之间的关联性。

而C++因为支持类的属性,所以可以将数据与函数封装成一个对象,这当然也更符合我们对于事物的认知。

但是C++在实现上会比C复杂一些,尤其是使用继承关系和template情况下时,但是这并不意味着C++就更好(从软件工程的眼光来看)或者更差。

封装之后的布局成本

一个C中的一个结构体,加上操作结构体的函数,将其封装成一个类之后。

第一个可能的问题就是:加上封装之后,布局成本增加了多少?

看下面的代码:

//C的写法
typedef struct point3d
{
    float x;
    float y;
    float z;
}Point3d;
void print(Point3d &point)
{
    printf("(%g,%g,%g)", point.x, point.y, point.z);
}

//C++的写法
class Point3d
{
public:
    Point3d();
    ~Point3d();
    void Print();
private:
    float x;
    float y;
    float z;
};

在上面这种情况 ,答案是并没有增加成本。

三个成员变量,直接包含在每一个类的对象中,就像C中的struct的情况一样。

而成员函数只产出一个实例,当然内联函数处理方法是在调用处展开。

class 类型的Point3d 相对 struct 类型的 Point3d来说,并未增加任何空间或执行期的不良后果。

其实C++相对于C的布局成本和存取时间上的额外负担主要是有virtual引起的:

  • Virtual function 机制,用以支持一个有效率的“Runtime Binding(执行期绑定)。”
  • Virtual base class 用以实现“多次出现在继承体系中的base class,有一个单一而被共享的实例。”
    此外还有一些多重继承下的额外负担,发生在“一个derived class和其第二个或者后继的base class的转换”之间。

然而就一般而言,C++相对于C来说并没有绝对的庞大和低效。

赞(0) 传送门
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。墨影 » C++相对于C的布局成本