【问题标题】:C++ (gcc/g++) Two huge arrays of strings take extremely long to compileC++ (gcc/g++) 两个巨大的字符串数组需要很长时间来编译
【发布时间】:2013-03-03 11:38:07
【问题描述】:

对于用 C++ 编写的程序,我需要两个包含数据的巨大字符串数组。

它们在头文件中定义如下:

#include <string>
static const string strdataA[30000]={"this is the first line of the data",
    "the second line of data",
    "other stuff in the third line",

下到

    "last line."};
//second array strings
static const string strdataB[60000]={"this is the first line of the data",
    "the second line of data",
    "other stuff in the third line",

下到

    "last line."};

但是当我用 g++ 编译它时,它需要很长时间,以至于我没有看到它完成。它还使用大约 2 GB 的虚拟内存。所以我把strdataB[]注释掉了,然后程序确实编译了,但是过了很久还是这样。可执行文件只有大约 8 Mb 并且运行良好。

我可以做些什么来加快编译过程?我不介意是否必须更改代码,但我不想使用外部文件来加载。我想要一个数组,因为它在程序中非常适合我。

我在网上某处读到“静态常量”应该可以解决问题,但我从经验中了解到它没有。

非常感谢您的任何建议!

【问题讨论】:

  • 你在说几行?您的源代码中真的有 30,000 和 60,000 个字符串吗?
  • 我假设它们在源文件而不是头文件中。
  • 您意识到加载器必须执行与从外部文件加载字符串基本相同的操作?
  • std::string 数组和char* 数组之间的时间比较是 5 分钟对 2 秒。对象大小从大约 5 MB 下降到仅 1 MB。
  • 另外,将文字移动到标题之外的单个翻译单元。在标题中只提供extern 声明,这将降低单个翻译单元(而不是标题的所有用户)的成本

标签: c++ arrays string static constants


【解决方案1】:

您不应为此使用std::string。改用普通的旧const char*

const char * const strdataA[30000] = {
    "one",
    "two",
    //...
};

static 关键字在这里应该没什么区别。

这样,字符串本身将作为简单的文字存储在只读数据部分中,而数组本身将只是一个指针数组。此外,您避免在运行时运行字符串构造函数/析构函数。

【讨论】:

  • 这确实成功了,它现在眨眼之间就可以编译了。谢谢!
【解决方案2】:

我相信这些是 GCC 中的已知问题。你没有说你使用的是什么版本的 GCC,也许你应该尝试使用最新的稳定版本的 GCC,看看它是否有改进。

您可能不应该将所有字符串保留在源代码中。您可能应该在启动时从外部文件中加载它们。

【讨论】:

  • 同意,通过将字符串保留在外部并在启动时加载,程序更容易修改。这需要修改代码以修复字符串中的拼写错误。
  • @Chris.Stover 总的来说,我同意你们俩的观点。但是,例如,如果您将配置文件的架构存储在源代码中,那么出于安全原因,我认为这是一个好主意。
  • gcc --version 给出了“gcc (Ubuntu/Linaro 4.7.2-11lucid3) 4.7.2”,这是我能得到的最新版本。外部数据文件/数据库可能是一个解决方案,但我只想要一个可执行文件,而不是几个不同的文件。
【解决方案3】:

我可以做些什么来加快编译过程?

const char* strdataA ... 应该会加快编译过程。因为在您当前的版本中,g++ 必须为每个字符串创建大量的构造函数调用。

【讨论】:

  • 谢谢,这确实是解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多