处理大型 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);
};
您可以考虑使用数据文件(在您的代码之外),这些文件是您在程序启动时读取的。这会产生一些开销(文件读取时间),但您将解决编译时间问题。
为了节省编译时间,请尝试以下方法:
- 确保您的项目不包含丢失的文件。它导致 re-compile 即使根本没有变化)。
- 不要把数据放在headers里,把数据放在c\cpp个文件里,用headers里数据变量的
extern
。
- 不要包含来自其他 header 的不必要的 header。 (header 中的任何更改都会重新编译所有内容)
- 尽可能在 header 中使用前向声明(而不是包含)。
- 注意
#include <file>
和 #include "file"
之间的区别。如果您选择了错误的包含方法(例如使用 <> 来包含您的文件,或者使用“”来包含系统),您将花费更多的时间来搜索文件。
- 将包含目录从最常见到最不常见的顺序排列,也可以节省搜索文件的时间。
如果您不想知道为什么项目或文件是 re-built 或 re-compiled,即使没有任何更改,您可以按以下方式进行:
- 菜单:工具 -> 选项
- 在打开的Options左下角:Project and solution->Build and 运行:
- 然后在右侧面板中:将 MSBuild 项目构建输出详细程度更改为诊断。
- 构建项目
- 在诊断数据中查找 re-compiled.
的原因
祝你好运
首先介绍一下背景知识:
我正在使用 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);
};
您可以考虑使用数据文件(在您的代码之外),这些文件是您在程序启动时读取的。这会产生一些开销(文件读取时间),但您将解决编译时间问题。
为了节省编译时间,请尝试以下方法:
- 确保您的项目不包含丢失的文件。它导致 re-compile 即使根本没有变化)。
- 不要把数据放在headers里,把数据放在c\cpp个文件里,用headers里数据变量的
extern
。 - 不要包含来自其他 header 的不必要的 header。 (header 中的任何更改都会重新编译所有内容)
- 尽可能在 header 中使用前向声明(而不是包含)。
- 注意
#include <file>
和#include "file"
之间的区别。如果您选择了错误的包含方法(例如使用 <> 来包含您的文件,或者使用“”来包含系统),您将花费更多的时间来搜索文件。 - 将包含目录从最常见到最不常见的顺序排列,也可以节省搜索文件的时间。
如果您不想知道为什么项目或文件是 re-built 或 re-compiled,即使没有任何更改,您可以按以下方式进行:
- 菜单:工具 -> 选项
- 在打开的Options左下角:Project and solution->Build and 运行:
- 然后在右侧面板中:将 MSBuild 项目构建输出详细程度更改为诊断。
- 构建项目
- 在诊断数据中查找 re-compiled. 的原因
祝你好运