我试图在我的c ++程序中包含大字符串,其大小为20598617个字符,我使用#define
来实现它。我有一个包含此语句的头文件
#define "<huge string containing 20598617 characterd>"
当我尝试编译程序时,我收到错误为fatal error C1060: compiler is out of heap space
我尝试了以下命令行选项但没有成功
/Zm200
/Zm1000
/Zm2000
如何成功编译此程序?
平台:Windows 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> ...
)";
正如本主题中的其他帖子所述,这绝对不是处理大量数据的首选方法。