c++ - 处理大型头文件

标签 c++ compilation header header-files compiler-optimization

首先介绍一下背景:

我正在使用 Visual Studio 2017 - 专业添加

开发原生 C++ android 应用程序

我使用了标准模板。所以我有一个纯 c++ (11) 库,其中包含我的所有代码。以及在链接到我的库的主项目中定义的预编译 header 。

我在做什么

我正在编写一些需要大量嵌入数据的代码。

我在谷歌上搜索了一些好的方法来做到这一点,但大多数似乎都很麻烦,而且几乎总是有评论说只需将数据直接放入头文件中,因为这是最可移植的方式。

所以我现在有许多头文件,基本上包含静态数据数组。 注意它们不是“const”,就像您这样做一样,如果您碰巧移动了变量定义,Visual Studio 2017 将尝试显示数据。所以只是静态的。

然后,所有头文件都会聚合到一个头文件中,最后在标准 cpp 文件中引用该头文件。有效地使数据对该类私有(private)。

这一切都运行良好。但编译时间变得非常慢。如果我观察输出窗口,我可以看到它花费了 80% 的时间在 cpp 文件上(即使数据或代码没有发生任何更改)

现在这还不是编译器能做的最好的事情。我希望编译器会跳过此步骤,因为没有任何更改直接影响 cpp 文件。

我还尝试将内容移至预编译头中。但这只会导致每次构建 pch.h 文件都需要很长时间。

那么我做错了什么?

更新

我已经仔细检查过文件没有被更改。 如果我按 F6(构建)然后再次按,它仍然会重建大文件。

我还尝试重新处理静态数据,以便将其定义在 cpp 文件中。 这仍然没有什么区别。

为了清楚起见,这是一个示例:

.cpp 文件:

#include "Some.h"

unsigned char _someData[] =
{
   0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00,
};

unsigned char* Some::GetSomeData(void)
{
   return _someData;
}

.h 文件:

#pragma once

class Some
{
public:
static unsigned char* GetSomeData(void);
};

最佳答案

为了节省编译时间,请尝试以下操作:

  1. 确保您的项目不包含丢失的文件。即使没有任何更改,它也会导致重新编译)。
  2. 不要将数据放在 header 中,将数据放在 c\cpp 文件中并使用 extern标题中的数据变量。
  3. 不要包含其他 header 中不必要的 header 。 ( header 中的任何更改都会生成所有内容的重新编译)
  4. 尽可能在 header 中使用前向声明(而不是包含)。
  5. 请注意 #include <file> 之间的区别和#include "file" 。如果您选择了错误的包含方法(例如使用 <> 包含您的文件,或使用“”包含系统),您会花费更多时间来搜索文件。
  6. 按从最常见到不太常见的顺序排列包含目录,这也可以节省搜索文件的时间。

如果您想知道为什么项目或文件在没有任何更改的情况下被重新构建或重新编译,您可以按如下方式操作:

  1. 菜单:工具 -> 选项
  2. 在打开的选项左 Pane 中:项目和解决方案 -> 构建并运行:
  3. 然后在右 Pane 中:将 MSBuild 项目构建输出详细程度更改为“诊断”。
  4. 构建项目
  5. 在诊断数据中查找重新编译的原因。

祝你好运

关于c++ - 处理大型头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51512882/

相关文章:

c++ - C++线程和 promise

compilation -/usr/lib/libgmodule-2.0.so : could not read symbols: File in wrong format

c++ - 在新结构中声明的数组的地址

javascript - PDFMake - 动态 pageMargins 取决于标题的高度

C++ 为什么我的循环中断了?

c++ - std::vector 指针

c++ - 为什么没有从 std::tuple<Ts...>& 到 std::tuple<Ts&...> 的(隐式)转换?

compilation - CUDA C 应用程序的分布式编译(类似于 distcc,但支持 nvcc 编译器)

html - 如何将标题放在居中的 div 之上? (html/css)

apache-flex - 如何将图标添加到 AdvancedDataGrid 列标题并保留文本的自动换行功能