c++ - 自动生成的 .cpp 文件需要很长时间才能编译

标签 c++ qt compilation compilation-time

我已经自动生成了一个巨大但非常简单的 .cpp 文件。它定义了一个类:

#include <QString>
#include <map>

class CTrigramFrequencyTable_English 
{
public:
    CTrigramFrequencyTable_English();

private:
    std::map<QString /*trigram*/, quint64 /*count*/> _trigramFrequencyTable;
    const quint64 _totalTrigramCount;
};

并在构造函数中放入以下类型的 10k 行:

_trigramFrequencyTable[QString("and")] = 48760ull;

我大约在 10 分钟前开始编译这个 .cpp,并且它仍在进行中。有什么办法可以实现我想要的并减少编译时间吗?为什么还要花这么长时间?我见过不少包含 3k-5k 行常规代码的库,甚至还有模板,而且编译速度非常快。

底线 - 我不想将我的数据放入资源文件并解析该文件,我想将数据直接编译成二进制文件。

P. S.10k 行文件在调试配置下编译大约需要 30 秒;在发布时,我等待了 10 分钟并终止了该过程。

最佳答案

根据经验(在 MELT 中,最近的 GCC - 例如 4.8 或 4.9)生成的 C++(有点像 C)代码,例程的编译时间是大小(行数)的二次方一旦您希望编译器优化该例程。

在任何 optimizing compiler 中注册分配和指令调度算法又硬又复杂!

在您的特定情况下,您应该考虑更改 C++ 代码生成脚本以发出如下内容:

struct my_trigram_pair_st {
    const char*name;
    unsigned long long freq;
};
const struct my_trigram_pair_st my_trigrams[]= {
  { "and", 48760ull },
  // zillions of similar lines 
  { NULL, NULL }
};

并且最好将其作为 C(而非 C++)代码发出。它可以是 C 代码,因为 const char* 是一个普通的 C 字符串(对于 literal 字符串,如 "and"), freq 是一个纯数字。还更改您的生成器以发出合法的 C99 字符串(因此不要在内部发出 Ô,而是 \303\224 或最好是 \xc3\x94 ...)

然后,调整您的 C++ 程序以使用它:

extern "C" const struct my_trigram_pair_st my_trigrams[];
for (int i=0; my_trigrams[i].name != nullptr; i++) 
   _trigramFrequencyTable[QString(my_trigrams[i].name)]
       = my_trigrams[i].freq;

在这里,您在运行时将 UTF8 const char* 转换为 QString-s。

如果您需要您的脚本生成函数,请让您的脚本将这些函数拆分成更小的函数(例如每个函数最多一千行)。

或者将您的大量数据放入例如一些 Sqlite和/或 Json文件....(你甚至可以有一些里面有 JSON 的 Sqlite 文件)。

您还可以在编译该特定文件时禁用编译器中的优化……或者您可以等待更长的时间(数小时)。

关于c++ - 自动生成的 .cpp 文件需要很长时间才能编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27462883/

相关文章:

c++ - QtCreator - 将文件夹导入资源?

qt - 为什么Q_ASSERT而不是断言

scala - 程序在使用 scala 运行时可以正常工作,但在尝试使用 scalac 编译时出现编译错误

c++ - 为什么派生类必须重新定义重写的基类方法

c++ - 打乱矩阵

c++ - 为什么 *this 可以用作 & 类型?

unix - Cmake 无法工作 - 没有当前工作目录

c - Makefile:没有链接问题的编译

c++ - 为什么具有固定底层类型 char 的枚举值解析为 fct(int) 而不是 fct(char)?

c++ - C++ 中的运算符重载 + 和 +=