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

Xin*_*nus 21 c++

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

#define "<huge string containing 20598617 characterd>"
Run Code Online (Sandbox Code Playgroud)

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

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

/Zm200
/Zm1000
/Zm2000
Run Code Online (Sandbox Code Playgroud)

如何成功编译此程序?

平台:Windows 7

egr*_*nin 19

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

如果你告诉我们你为什么要这样做,我们可以提供很多选择.决定如何处理任意大数据是编程的主要部分.

编辑添加:

我没有猜测,而是查看了MSDN:

在连接相邻字符串之前,字符串不能超过16380个单字节字符.

大约一半长度的Unicode字符串也会生成此错误.

该页面的结论是:

您可能希望在自定义资源或外部文件中存储特别大的字符串文字(32K或更多).

其他编译器说什么?

进一步编辑添加:

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

char s[] = {'x','x','x','x'};
Run Code Online (Sandbox Code Playgroud)

我不断地将'x'每个测试作为#include文件进行测试.

一个8388608字节的字符串成功; 16777216个字节失败,出现"堆外空间"错误.

  • +1.我认为"将大数据合并到程序中".通常首选"不是这样做的".这个问题是有道理的,但只有"最好的解决方法是什么". (3认同)
  • IMO"为什么"并不重要.我相信当有人问一个精确的问题时(比如这个问题),最好给出准确的答案.当人们想要做一些奇怪的事情时,他们(有时)有他们的理由(如果他们不这样做,他们将在以后学习一些有用的东西). (2认同)
  • @Eric:我的回答虽然不如@Ira Baxter有用,但仍然是正确的.如果答案事实上是不正确的话,请注意,但我不认为我是. (2认同)

Ira*_*ter 14

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

为了避免这样的设计限制,我尽量不把整个东西放到一个文字字符串中.由于怀疑#define宏体同样具有相似的限制,我也不会尝试将整个事物放在一个#define中.

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

char c[]={ c1, c2, ...  c20598617 };
Run Code Online (Sandbox Code Playgroud)

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

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


Mic*_*gan 9

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


War*_*rty 9

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

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


amp*_*ine 7

增加编译器堆空间.

  • 嗯,这实际上是一个明智的答案(对于一个疯狂的问题)而且它已被低估了.我最后一次使用12兆字节的数据段的C程序,使用`ulimit`增加了内存限制. (3认同)

lea*_*der 6

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

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

请参阅前面问题的答案," 如何在构建时将文件的内容放入我的C++字符串中? "

(另外,请注意:.xbm格式化的存在.)