C++(gcc/g++)两个大字符串数组编译时间非常长

9

对于一个用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",

down to

    "last line."};

但当我用g++编译它时,它需要的时间非常长,以至于我没有看到它完成。 它还使用了大约2 GB的虚拟内存。 所以我注释掉了strdataB [],然后程序确实编译了,但仍然需要很长时间。可执行文件只有约8 MB,并且可以正常工作。
为了加快编译速度,我该怎么办? 如果必须更改代码,我也不介意,但是我不想使用外部文件进行加载。 我希望使用数组,因为它在程序中非常有效。
在网上读过“静态常量”应该起到作用,但我通过经验学到它并不起作用。
感谢您提前给出任何建议!

你在说多少行代码?你的源代码中真的有3万和6万个字符串吗? - Olaf Dietsche
1
我认为它们应该在源文件中而不是头文件中。 - Martin York
如果它们是常量文本,则编译一次即可完成。如果它们经常更改,请将它们放入数据库中。 - Bo Persson
2
std::string 数组和 char* 数组的时间比较为 5 分钟 vs 2 秒。对象大小从约 5 MB 减少到仅 1 MB。 - Olaf Dietsche
2
此外,将字面量移动到单个翻译单元之外的头文件中。在头文件中提供一个 extern 声明即可,这将减少成本到一个翻译单元(而不是头文件的所有用户)。 - David Rodríguez - dribeas
显示剩余3条评论
3个回答

9

你不应该使用std::string,而是应该使用普通的const char*

const char * const strdataA[30000] = {
    "one",
    "two",
    //...
};
static关键字在这里不应该有太大的区别。
这种方式,字符串本身将作为简单文字存储在只读数据部分,而数组本身将仅是指针数组。此外,您可以避免在运行时运行字符串构造函数/析构函数。

确实,这个方法很管用,现在编译速度飞快。谢谢! - L.A. Rabida

3

我相信这些是GCC的已知问题。您没有说您使用的GCC版本,也许您应该尝试使用最新的稳定版本的GCC,看看是否会改善情况。

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


同意,通过将字符串保持为外部文件并在启动时加载,程序更容易修改。这需要修改代码以修复字符串中的拼写错误。 - Chris.Stover
@Chris.Stover 总的来说,我同意你们两个的观点。然而,如果例如你将配置文件的模式存储在源代码中,那么出于安全考虑,我认为这是一个好主意。 - Alex Chamberlain
gcc --version 给出了 "gcc (Ubuntu/Linaro 4.7.2-11lucid3) 4.7.2",这是我能得到的最新版本。外部数据文件/数据库可能是一个解决方案,但我只想要一个单独的可执行文件,而不是几个不同的文件。 - L.A. Rabida

1
我该怎么做才能加快编译过程?
const char* strdataA ... 应该可以加快编译过程,因为在你目前的版本中,g++必须为每个字符串创建大量构造函数调用列表。

谢谢,这确实是解决方案。 - L.A. Rabida

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接