代码之家  ›  专栏  ›  技术社区  ›  Paul Spain

使用大型头文件

  •  2
  • Paul Spain  · 技术社区  · 6 年前

    首先是一些背景:

    我正在使用Visual Studio 2017-专业版附加功能

    开发一个本地C++ Android应用程序

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

    我正在做什么

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

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

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

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

    这一切都很好。但是编译时间变得非常慢。如果我观察输出窗口,我可以看到它将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);
    };
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   SHR    6 年前

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

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

    如果您不知道为什么重新构建或重新编译一个项目或文件,即使没有任何更改,也可以按如下方式进行:

    1. 菜单:工具->选项
    2. 在“打开的选项”中,左泛:项目和解决方案->生成并运行:
    3. 然后在右边的面板中:将msbuild project build output verbosity更改为diagnostic。
    4. 建立项目
    5. 在诊断数据中查找重新编译的原因。

    祝你好运

        2
  •  1
  •   jaudo    6 年前

    您可以考虑使用程序启动时读取的数据文件(代码外部)。这将产生一些开销(文件读取时间),但您将解决编译时间问题。