【发布时间】:2018-07-25 07:12:20
【问题描述】:
首先介绍一下背景:
我正在使用 Visual Studio 2017 - 专业版
开发原生 C++ android 应用程序
我使用了标准模板。所以我有一个纯 c++ (11) 库,我的所有代码都在其中。以及链接到我的库的主项目中定义的预编译头文件。
我在做什么
我正在编写一些需要大量嵌入数据的代码。
我在谷歌上搜索了一些好的方法来做到这一点,但大多数方法似乎很麻烦,而且几乎总是有 cmets 说直接将数据放入头文件中,因为这是最便携的方法。
所以我现在有许多头文件,它们基本上包含静态数据数组。 注意它们不是 'const' 就好像你这样做了,如果你碰巧移动了变量定义,Visual Studio 2017 将尝试显示数据。所以只是静态的。
然后将所有头文件聚合到一个头文件中,然后最终在标准 cpp 文件中引用。有效地将数据设为该类的私有数据。
这一切都很好。但是编译时间变得非常慢。如果我观察输出窗口,我可以看到它花费了 80% 的时间在 cpp 文件上(即使数据或代码没有更改)
现在这不是编译器所能做的最好的。我希望编译器跳过这个,因为没有直接影响 cpp 文件的更改。
我还尝试将内容移到预编译的标头中。但这只会使 pch.h 文件每次构建都需要很长时间。
那我做错了什么?
更新
我已经仔细检查了文件没有被更改。 如果我按 F6 (build) 然后再按一次,它仍然会重建大文件。
我也尝试过修改静态数据,以便在 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);
};
【问题讨论】:
-
如果代码没有变化,编译器显然不应该重新编译。那是你应该看的地方。例如,比较源文件和目标文件的时间戳。其次,为什么将数据放在一个包含在一个 cpp 文件中的头文件中。为什么不直接将数据放在 cpp 文件中呢?这是最佳做法。
-
稍后我会再次检查时间戳。数据位于 .h 文件中,因为数据是由另一个离线进程生成的。此过程可以重新创建 .h 文件而不会破坏其他任何内容。如果我希望数据直接在我的 cpp 文件中,那么我的工具集将需要更复杂并且“了解”更多关于系统的信息。那不是一个好的设计。
-
忘了说我更喜欢非 android 唯一的解决方案。即我可以在本机 c++ 中做的事情,这样它就可以移植到苹果上工作。
-
在一个cpp文件和一个getter函数中定义数据,并在.h文件中声明这个getter。顺便说一句,您使用什么框架来制作适用于 android 和 IOS 的应用程序?
-
我可以确认在构建之间没有任何文件发生变化。只需连续按两次F6(构建)每次都会产生相同的效果(对cpp文件进行长时间编译)
标签: c++ compilation header header-files compiler-optimization