GP与OOP

GP   :generic programming 类属编程 另一术语 泛型编程 (多么大气的一个词汇)

OOP:Object Oriented Programming 面向对象编程

类属编程是构成库的另一种方式, 这与传统的oop是不同的。这类程序库一般由类属组件和类属算法组成,组件和算法通过迭代器组装起来,组件则对迭代器提供一定的封装。这种程序库的优点在于能够提供比传统程序库更灵活的组装方式,而不损失效率。

广义的,将泛型程序设计描述为“利用模板设计的程序”(programming with template),将面向对象程序设计描述为“利用继承的程序设计”(programming with inheritance)。

再不严谨的情况下 泛型编程与面向对象编程间接地与模板和继承有关系。严谨的说:泛型程序设计基于参数化多态(parametric polymorphism),面向对象程序设计基于子类型多态(subtype polymorphism)。在C++中这些观念通过模板和继承实现,而在其他语言中其实现机制并非如此(从这句的阐述表示泛型设计和面向对象程序设计是一种抽象的逻辑思维,至于实现可以用怎么想的和怎么做的是有本质性的区别的)。

通过比较C++下的继承(以及虚函数)和模板,来比较一下GP与OOP

1.速度:虚函数比函数模板慢

        虚函数调用慢于对模板的调用,调用函数模板与调用普通函数的速度是相同的。虚函数调用包含附加指针提领(dereference),以便在虚函数表中查找合适的方法。就操作的本身来说,开销并不大。然而,,明显的速度下降可能间接地来自于编译后的代码,因为这种间歇性(indirection)可能阻止优化编译器将函数内联(inline),进一步,在内联之后对环境代码(surrounding code)的再次优化也被阻止。

        当然,开销的整体影响完全依赖于在函数中完成的工作量,即,开销将在多大的程度上平摊。对于STL迭代器与容器级别的组件,函数调用开销是非常显著的。这个级别上的效率很大程度上被像 operator++()这样的函数是否内联而影响,由于这个原因模板是实现高效的、低层的、可重用的组件的不二选择。

2.运行时分派对比于编译时分派

       虚函数的运行时分派(run-time dispatch)和继承是面向对象程序设计的而最显著特征之一。对于特定种类的组件,运行时分派是绝对必须的,判别只能基于在运行时才可用的信息作出。这种情况下,虚函数和继承便是必须。

        模板不提供运行时分派,但是他们他提供了编译时的显著的灵活性。事实上,当编译能够在编译时执行时,模板比继承提供了更多的灵活性。因为他们不需要模板参数类型继承自某些基类。

3.代码大小:虚函数小、模板大

        对基于模板的程序的一个普遍关注的是代码膨胀(code bloat),通常是由于模板的率意使用。比较于基于继承的相应组件,精心设计的模板组件并不会导致代码尺寸的显著增大。控制代码尺寸的主要技术是将依赖于模板类型的功能与独立于模板类型的功能相分离。此技术的使用可以参考std::list的SGI STL实现。

4.二元方法问题(binary method program)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值