技巧
1.使用外覆代理类,只有方法和指向要代理对象的一个指针,构造初始化这个指针,这样耦合性很低。代理类可以加上RRID,资源释放即析构。还可以进一步优化使用raii的指针对象,自动释放对象。 2.动态多态和静态多态: C++中的动态多态有如下优点: ? 可以很优雅的处理异质集合。 ? 可执行文件的大小可能会比较小(因为它只需要一个多态函数,不像静态多态那样,需 要为不同的类型进行各自的实例化)。 ? 代码可以被完整的编译;因此没有必须要被公开的代码(在发布模板库时通常需要发布 模板的源代码实现)。 C++中 static 多态的优点: ? 内置类型的集合可以被很容易的实现。更通俗地说,接口的公共性不需要通过公共基类 实现。 ? 产生的代码可能会更快(因为不需要通过指针进行重定向,先验的(priori)非虚函数 通常也更容易被 inline)。 ? 即使某个具体类型只提供了部分的接口,也可以用于静态多态,只要不会用到那些没有 被实现的接口即可。
陷阱
1.c++的abi(二进制接口),标准没有定义。对象布局(包括基类),调用约定和name mangling,虚函数机制,静态对象实例化,c++语言支持(set_unexpected,operate new[]等),异常处理,RTTI,模板实例化机制,运行时库内存调试,不同平台都没有统一。 2.inline使代码耦合性提高改动引起重新编译,使代码膨胀,cache装不下大函数的情况可能影响运行速度。还有debug调试不能进入内联函数的问题。 3.区分萃取和策略。 ? 萃取代表的是一个模板参数的本质的、额外的属性。 ? 策略代表的是泛型函数和类型(通常都有其常用地默认值)的可以配置的行为。 为了进一步阐明两者之间可能的差异,我们列出了如下和萃取有关的观察结果: ? 萃取在被当作固定萃取(fixed traits)的时候会比较有用(比如,当其不是被作为模板 参数传递的时候)。 ? 萃取参数通常都有很直观的默认参数(很少被重写,或者简单的说是不能被重写)。 ? 萃取参数倾向于紧密的依赖于一个或者多个主模板参数。 ? 萃取在大多数情况下会将类型和常量结合在一起,而不是成员函数。 ? 萃取倾向于被汇集在萃取模板中。 对于策略类,我们有如下观察结果: ? 策略类如果不是被作为模板参数传递的话,那么其作用会很微弱。 ? 策略参数不需要有默认值,它们通常是被显式指定的(虽有有些泛型组件通常会使用默 认策略)。 ? 策略参数通常是和其它模板参数无关的。 ? 策略类通常会包含成员函数。 ? 策略可以被包含在简单类或者类模板中 3.SFINAE(替换失败但不是错误)最主要的作用,是保证编译器在泛型函数、偏特化、及一般重载函数中遴选函数原型的候选列表时不被打断。除此之外,它还有一个很重要的元编程作用就是实现部分的编译期自省和反射。 4.string内存优化:cow(写时复制)已经不需要了,有替代方案string_view和std::move,sso(small string optimizations)字符串比较短就放栈中,拷贝就是值拷贝。 5.如果基类析构需要执行或者class已经有了虚函数,析构函数需要改成虚函数。这样基类的虚构函数才会执行。但是一般如果设计成基类不带数据,也不需要析构就不要加了,加了虚函数内存布局就必定不是pod了
|