如何使用 C++ 模板减少编译时间

2024-02-21

我正在将我的 C++ 应用程序的一部分从使用旧的 C 类型数组更改为模板化的 C++ 容器类。看这个问题 https://stackoverflow.com/questions/2472944/good-c-array-class-for-dealing-with-large-arrays-of-data-in-a-fast-and-memory-e了解详情。虽然该解决方案运行良好,但我对模板化代码所做的每一个微小更改都会导致发生大量重新编译,从而大大减慢构建时间。有没有什么方法可以将模板代码从标头中取出并返回到 cpp 文件中,以便较小的实现更改不会导致重大重建?


几种做法:

  • The 导出关键字 http://www.parashift.com/c++-faq-lite/separate-template-fn-defn-from-decl-export-keyword.html理论上可以提供帮助,但它的支持很差,并在 C++11 中被正式删除。
  • 显式模板实例化(参见here https://isocpp.org/wiki/faq/templates#separate-template-fn-defn-from-decl or here https://msdn.microsoft.com/en-us/library/by56e477%28v=vs.140%29.aspx)是最直接的方法,如果您可以提前预测您将需要哪些实例化(并且如果您不介意维护此列表)。
  • 外部模板,已经被多个编译器支持作为扩展。据我了解,外部模板不一定让您将模板定义移出头文件,但它们确实使编译和链接速度更快(通过减少模板代码必须实例化和链接的次数)。
  • 根据您的模板设计,您也许能够将其大部分复杂性转移到 .cpp 文件中。标准示例是一个类型安全的向量模板类,它仅包装一个类型不安全的向量void*;所有的复杂性都集中在void*驻留在 .cpp 文件中的向量。 Scott Meyers 在 Effective C++ 中给出了更详细的示例(第 42 项,“明智地使用私有继承”,第 2 版)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 C++ 模板减少编译时间 的相关文章

随机推荐

  • MySQL:为什么我的 INSERT 语句在自动递增 id 时会跳过 56 个数字?

    在向我的 SQL 课程的学生演示 INSERT 语句时 我们发现了 MySQL 8 0 中的一些奇怪行为 请帮助我们了解发生了什么 不需要解决方法 因为我们知道一些解决方法 这是为了学习 而不是为了生产 谢谢 我们正在创建一个新数据库并从众
  • MVC4 脚手架添加控制器给出错误“无法检索元数据...”

    我使用的是 RTM 版本的 Windows 8 和 VS 2012 Ultimate 我有一个 MVC4 项目使用具有代码优先实体框架模型的 SqlCe 4 0 模型非常简单 public class MyThing public int
  • Ubuntu 上的 java 和 libGDX / LWJGL 游戏全屏多显示器尺寸错误

    我正在开发一个 libGDX LWJGL 之上的库 游戏项目 并从多个不同的工作站使用 Intellij IDEA IDE Windows 7 x64 笔记本电脑 配备两个显示屏 1920x1080 和 1600x1200 nVidia G
  • WCF 多重绑定

    当我尝试多个端点时出现以下错误 System ServiceModel AddressAlreadyInUseException The TransportManager failed to listen on the supplied U
  • XAudio2 - 更改频率时播放生成的正弦声音

    我想开发一个应用程序来匹配您的耳鸣频率 播放频率 用户通过按加号或减号按钮来减少或增加频率 参见部分代码 基于 stackoverflow 的一些编码 谢谢 public static short BufferSamples new sho
  • Scala Play Json 读取

    我有一个示例代码如下 import play api libs json import play api libs functional syntax import play api data validation ValidationEr
  • 我应该使用什么 shebang 来始终指向 python3?

    我有一个使用 shebang 的脚本 usr bin env python 它在 Python 3 是唯一可用版本的计算机上运行良好 但在同时具有 Python 2 和 Python 3 的计算机上 它使用 Python 2 运行脚本 如果
  • 如何检测 TabBarView 刚刚被拖动?

    TabBar 小部件有一个 onTap 回调 可以检测用户何时刚刚按下了选项卡 这很有用 因此我们可以准备新的 tabView 来显示一些动态数据 TabBar 小部件还具有拖动功能 允许更改显示的 tabView 与点击另一个选项卡的结果
  • 当我将鼠标悬停在其上方大小发生变化的元素上时,如何防止 div 移动

    http bit ly 1fVGrBT http bit ly 1fVGrBT 这是我的网站 当您将鼠标悬停在 Problem 上并移开时 其下方的 div 会被上下推动 解决方案也会发生同样的情况 有什么想法或建议如何防止它移动吗 我认为
  • 采购后清理全局环境:如何在 R 中删除某种类型的对象

    我读到了一个公共数据集 该数据集在构建最终数据帧的过程中创建了数十个临时向量 由于该数据框将作为更大流程的一部分进行分析 因此我计划source使用创建数据帧的 R 脚本 但不想让自己或未来的用户面临混乱的全局环境 我知道我可以使用ls列出
  • 具有多个字段的对象的Java比较器[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个对象Collection有 5 个字段 id entityType entityId brandId productId 要对一个
  • 如何拦截 .NET 程序中对文件的访问

    我需要在系统尝试访问文件时进行拦截 并在其发生之前执行某些操作 您可以使用FileSystemWatcher http msdn microsoft com en us library system io filesystemwatcher
  • 使用 python-requests 上传文件 - UnicodeDecodeError

    我正在尝试使用 python requests 上传文件 with open file zip rb as fff up requests post url files file fff 并得到 UnicodeDecodeError asc
  • TADOStoredProc 和 SQL Server 存储过程,参数作为默认值

    我正在使用 Delphi 7 和 SQL Server 2008 我创建了一个虚拟表和虚拟存储过程 如下所示 CREATE TABLE dbo Persons P ID int IDENTITY 1 1 NOT NULL LastName
  • 为什么枚举会转换为函数?

    考虑 enum Colors Red Green Blue 它转换成这样 var Colors function Colors Colors Colors Red 0 Red Colors Colors Green 1 Green Colo
  • @classmethod 的位置

    装饰器类方法的源代码位于python源代码中的哪里 具体来说 我无法找到它在版本 2 7 2 中定义的确切文件 我没有回答你的问题 但下面的代码显示了装饰器可能相当于classmethod 用纯 Python 编写 因为源代码中的那个是用
  • Xcode — 在外部编辑器中快速打开当前文件

    是否可以设置键盘快捷键 或者在某处添加一些菜单项 以在外部编辑器中打开当前编辑的文件 显然我可以这样做 在文件树中右键单击 在Finder中显示 在窗口标题中右键单击 选择包含目录 右键单击文件 打开方式 应用程序 但步骤太多了 呵呵 我已
  • Hibernate 搜索查找短语的部分匹配

    在我的项目中 我们使用带有 lucene 分析器和 Solar 的 Hibernate Search 4 5 我向我的客户提供一个文本字段 当他们输入一个短语时 我想找到所有User名称包含给定短语的实体 例如 考虑数据库中具有以下标题的条
  • 什么时候问题对于正则表达式来说太复杂了?

    请不要回答显而易见的问题 但是有哪些限制标志告诉我们不应使用正则表达式来解决问题 例如 为什么完整的电子邮件验证对于正则表达式来说太复杂 正则表达式是以下内容的文本表示有限状态自动机 http en wikipedia org wiki F
  • 如何使用 C++ 模板减少编译时间

    我正在将我的 C 应用程序的一部分从使用旧的 C 类型数组更改为模板化的 C 容器类 看这个问题 https stackoverflow com questions 2472944 good c array class for dealin