处理大型 header 文件

Working with large header files

首先介绍一下背景知识:

我正在使用 Visual Studio 2017 - Professional Addition

开发本机 C++ android 应用程序

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

我在做什么

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

我在谷歌上搜索了一些好的方法,但大多数方法看起来都很麻烦,而且几乎总是有评论说将数据直接放入 header 文件中,因为这是最便携的方法。

所以我现在有一些 header 基本上包含静态数据数组的文件。 注意 它们不是 'const' 就好像你那样做然后 Visual Studio 2017 将尝试显示数据,如果你碰巧移过变量定义。所以只是静态的。

然后将所有 header 文件聚合到一个 header 文件中,然后最终在标准 cpp 文件中引用。有效地使数据私有化 class.

一切正常。但是编译时间变得非常慢。如果我观察输出 window 我可以看到它花费了 80% 的时间在 cpp 文件上(即使没有对数据或代码进行任何更改)

这不可能是编译器所能做到的最好的。我希望编译器跳过这个,因为没有直接影响 cpp 文件的更改。

我也尝试过将东西移到预编译的 header 中。但这只会使 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. 确保您的项目不包含丢失的文件。它导致 re-compile 即使根本没有变化)。
  2. 不要把数据放在headers里,把数据放在c\cpp个文件里,用headers里数据变量的extern
  3. 不要包含来自其他 header 的不必要的 header。 (header 中的任何更改都会重新编译所有内容)
  4. 尽可能在 header 中使用前向声明(而不是包含)。
  5. 注意 #include <file>#include "file" 之间的区别。如果您选择了错误的包含方法(例如使用 <> 来包含您的文件,或者使用“”来包含系统),您将花费更多的时间来搜索文件。
  6. 将包含目录从最常见到最不常见的顺序排列,也可以节省搜索文件的时间。

如果您不想知道为什么项目或文件是 re-built 或 re-compiled,即使没有任何更改,您可以按以下方式进行:

  1. 菜单:工具 -> 选项
  2. 在打开的Options左下角:Project and solution->Build and 运行:
  3. 然后在右侧面板中:将 MSBuild 项目构建输出详细程度更改为诊断。
  4. 构建项目
  5. 在诊断数据中查找 re-compiled.
  6. 的原因

祝你好运