`
isiqi
  • 浏览: 16567227 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Item 44 与模板参数无关的代码

阅读更多

模板可以节省时间,减少代码的重复。
假设有20个类,每个类15个成员函数。那么可以用一个类模板来定义,然后由编译器去实例化所需要的类。
模板类的成员函数只在用到的时候才实例化。

过度使用模板会导致目标代码的膨胀。要通过共性/异性分析防止这种事情发生。

两份invert,很明显的代码重复。修改之后:

1> SquareMatrixBase是为了避免代码膨胀而定义的,所以其invert声明为protected,而非public。
2> 因为使用了内联,所以派生类调用基类的invert时间成本为零。
3> 必须使用this指针去调用基类的invert。详见Item 43。
4> 继承关系使用private,表示基类只是为了辅助实现而设计的。
5> 存储数据的指针,要传给基类,以操作数据。
6> 如果觉得 data[n*n] 会让类变大,可以使用 boost::scoped_array<T> pData 来申请堆上内存。

● 讨论
1> 把size写死到invert里可能会有编译器优化;把size当参数传给invert可以减小目标代码,从而提高执行效率。哪一个更好,这个要都试过才知道。
2> 把invert移到基类,会增大对象的体积。比如上面的例子,至少每个基类要有个指针吧。对指针的生存期的管理又增加了使用复杂度。


● 对type parameter的优化
1> 前面讨论的都是non-type parameter,而如int、long这些所谓的type parameter也可能导致代码膨胀。比如某些平台int和long一样,一些linker却不理会,于是制造出两份,造成了重复。
2> 大多数平台,对于不同类型的指针,其实二进制表示是完全相同的。这也可以用来优化:成员函数使用强类型指针,内部实现使用void无类型指针函数完成工作。

分享到:
评论

相关推荐

    模板-函数模板与类模板.ppt

    模板是C++编程中的一种重要特性,用于创建通用的、与特定数据类型无关的代码,以便在处理不同数据类型时重用。模板分为两种主要类型:函数模板和类模板。 1. **函数模板**: - 函数模板是C++中提供的一种方式,...

    C++程序设计:第八讲 模板与数据结构-.pdf

    C++模板是一种先进的编程技术,它使得程序员可以编写与数据类型无关的代码。本讲主要围绕C++中的模板及其在数据结构中的应用展开。 首先,模板通过将数据类型参数化来增强代码的通用性。在C++中,模板分为函数模板...

    FreeMarker

    FreeMarker 支持自定义命令,通过 `macro` 可以定义新的模板命令,并且可以向这些命令传递参数。这有助于减少重复代码,并增强模板的复用性。 ### 总结 FreeMarker 是一款功能强大的模板引擎,能够帮助开发者高效...

    Java单选.docx

    - 平台无关性:Java程序可以在任何安装了Java虚拟机(JVM)的操作系统上运行,这是Java最大的优势之一。 - 面向对象:Java完全支持面向对象编程特性,如封装、继承和多态。 - 安全性:Java设计时充分考虑了安全性...

    sharepoint 2013 如何创建一个webservice获取sharepoint列表数据

    3. **编写代码**:在新的Web服务类中,继承`Microsoft.SharePoint.Client.ClientContext`类,该类提供了与SharePoint 2013服务器通信的能力。通过这个上下文,你可以获取到列表实例并执行查询。以下是一个简单的示例...

    funwithmeth.com

    很抱歉,但根据您提供的信息,标题"funwithmeth.com"和描述似乎与IT知识无关,而是关于一个可能涉及药物成瘾的文学作品。而标签"Nunjucks"是与IT相关的,它是一个JavaScript模板引擎,常用于Web开发,特别是在Python...

    C#基础概念二十五问

    泛型提供了一种创建类型无关的代码的方式,增强了代码的复用性和安全性。如`List&lt;T&gt;`,其中`T`代表任何类型。 16. **异常处理的结构是什么?** 异常处理使用try-catch-finally结构,如`try {...} catch ...

    经典Python面试题之Python基础篇.docx

    #### 44. 比较:a=[1, 2, 3] 和 b=[(1), (2), (3)] 以及 b=[(1,), (2,), (3,)] 的区别? - **b=[(1), (2), (3)]**: 每个元素是一个整数。 - **b=[(1,), (2,), (3,)]**: 每个元素是一个只有一个元素的元组。 #### ...

    C++MFC教程

    |------ 2.4 在窗口中绘制设备相关位图,图标,设备无关位图 |------ 2.5 使用各种映射方式 |------ 2.6 多边形和剪贴区域 +-- 第三章 文档视结构 |------ 3.1 文档 视图 框架窗口间的关系和消息传送规律 |------ ...

    freemarker总结

    filename:该参数指定被包含的模板文件 options:该参数可以省略,指定包含时的选项,包含encoding和parse两个选项,其中encoding指定包含页面时所用的解码集,而parse指定被包含文件是否作为FTL文件来解析,如果省略了...

    java常用英语

    它设计为平台无关性,意味着编写的Java代码可以在任何支持Java的平台上运行,而无需重新编译。 - **JDK (Java Developer's Kit)**: Java开发工具包,包含了编译、调试和运行Java程序所需的所有工具。它是开发Java...

Global site tag (gtag.js) - Google Analytics