处理大型头文件

时间:2018-07-25 07:12:20

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

首先介绍一下背景知识

我正在使用Visual Studio 2017-专业增补

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

我使用了标准模板。因此,我有一个纯c ++(11)库,所有代码都在其中。在主项目中定义了一个预编译的标头,该标头链接到我的库。

我在做什么

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

我四处寻找实现此目的的好方法,但是大多数方法似乎很麻烦,并且几乎总是有评论说仅将数据直接放入头文件中,这是最可移植的方法。

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

然后将所有头文件聚合到一个头文件中,然后最终在标准cpp文件中引用该头文件。有效地将数据私有化给该类。

一切正常。但是编译时间变得非常缓慢。而且,如果我看到输出窗口,我可以看到它在cpp文件上花费了80%的时间(即使数据或代码没有更改)

现在这不是编译器可以做的最好的事情。我希望编译器跳过此操作,因为没有直接影响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);
};

2 个答案:

答案 0 :(得分:2)

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

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

即使没有更改,如果您不知道为什么要重建或重新编译项目或文件,也可以按以下步骤进行操作:

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

祝你好运

答案 1 :(得分:1)

您可以考虑使用程序启动时读取的数据文件(代码之外)。这样会增加一些开销(文件读取时间),但是您会解决编译时间问题。