在我们的c ++程序中包含大字符串?

时间:2010-05-23 05:10:36

标签: c++

我试图在我的c ++程序中包含大字符串,其大小为20598617个字符,我使用#define来实现它。我有一个包含此语句的头文件

#define "<huge string containing 20598617 characterd>"

当我尝试编译程序时,我收到错误为fatal error C1060: compiler is out of heap space

我尝试了以下命令行选项但没有成功

/Zm200
/Zm1000
/Zm2000

如何成功编译此程序?

平台:Windows 7

7 个答案:

答案 0 :(得分:19)

你不能,不可靠。即使它会编译,也可能会破坏运行时库或操作系统假设,等等。

如果您告诉我们为什么您正在尝试这样做,我们可以提供很多替代方案。决定如何处理任意大数据是编程的主要部分。

已编辑添加:

而不是猜测,我调查了MSDN

  

在相邻字符串之前   连接,一个字符串不能   长度超过16380单字节   字符。

     

大约一半的Unicode字符串   这个长度也会产生这个   错误。

页面结束:

  

您可能需要特别存储   大字符串文字(32K或更多)in   自定义资源或外部文件。

其他编制者说什么?

进一步修改以添加:

我创建了一个这样的文件:

char s[] = {'x','x','x','x'};

我一直将'x'的出现次数增加一倍,将每个值都作为#include文件进行测试。

8388608字节字符串成功; 16777216个字节失败,出现“堆外空间”错误。

答案 1 :(得分:14)

我怀疑你遇到了字符串大小的设计限制。 大多数人都认为一百万个字符足够长: - }

为避免此类设计限制,我尽量不将整个内容放入单个文字字符串中。由于怀疑#define宏体同样具有相似的限制,我也不会尝试将整个事物放在一个#define中。

大多数C编译器都会接受相当大的单个字符列表作为初始化程序。如果你写

char c[]={ c1, c2, ...  c20598617 };

将c_i作为您的个人角色,您可能会成功。我见过GCC2应用程序,其中有200万个这样的元素(显然它们正在加载某种类型的ROM映像)。您甚至可以将c_i分组为K个字符的块,K = 100,1000,10000,以满足您的口味,这可能实际上有助于编译器。

您也可以考虑通过压缩算法运行字符串, 通过上述任何方法将压缩结果放入C ++文件中, 并在程序加载后解压缩。 我怀疑你可以将减压算法变成几千字节。

答案 2 :(得分:9)

嗯,将字符串存储在某种单独的资源中并加载它?说真的,在嵌入式土地中,您可以将其作为单独的资源而不是将其保存在RAM中。在Windows上,我相信你可以使用.dll或其他外部资源来为你处理这个问题。编译器不是为您提供这种大小的资源而且会失败。

答案 3 :(得分:9)

将字符串存储到文件中,然后打开并阅读它......

它更干净/有组织[我假设现在你有一个名为blargh.h的文件,其中包含一个#Define ...]

答案 4 :(得分:7)

增加编译器堆空间。

答案 5 :(得分:5)

如果你的字符串来自一个大文本或二进制文件,你可能会运气xxd -i命令(根据Ira Baxter的答案获取数组中的所有内容)或{{1}的变体}命令(将所有内容都放入bin2obj文件中,您可以链接到程序中。

请注意,在这种情况下,字符串可能不会以空值终止。

查看先前问题“How can I get the contents of a file at build time into my C++ string?

的答案

(另外,请注意:.xbm format的存在。)

答案 6 :(得分:0)

这是一个非常古老的问题,但由于还没有确定的答案:C ++ 11的原始字符串文字似乎可以完成这项工作。

这很好地汇编了GCC 4.8:

#include <string>

std::string data = R"(
    ... <1.4 MB of base85-encoded string> ...
)";

正如本主题中的其他帖子所述,这绝对不是处理大量数据的首选方法。