代码之家  ›  专栏  ›  技术社区  ›  Xinus

在我们的C++程序中包括大字符串?

c++
  •  21
  • Xinus  · 技术社区  · 15 年前

    我尝试在我的C++程序中包括大字符串,它的大小是20598617个字符,我正在使用。 #define 做到这一点。我有一个包含这个语句的头文件

    #define "<huge string containing 20598617 characterd>"
    

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

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

    /Zm200
    /Zm1000
    /Zm2000
    

    我怎样才能成功地编译这个程序?

    平台:Windows 7

    7 回复  |  直到 7 年前
        1
  •  19
  •   egrunin    9 年前

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

    如果你告诉我们 为什么? 你想这么做,我们可以提供 太多了 备选方案。决定如何处理任意大的数据是编程的一个主要部分。

    编辑添加:

    我不是猜测,而是调查 MSDN :

    在相邻字符串 连接后,字符串不能 大于16380单字节 字符。

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

    本页结束:

    你可能想破例存储 中的大字符串文本(32K或更多) 自定义资源或外部文件。

    其他编译器怎么说?

    进一步编辑以添加:

    我创建了这样的文件:

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

    我不断地把 'x' ,测试每一个 #include 文件。

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

        2
  •  14
  •   Ira Baxter    15 年前

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

    为了避免这样的设计限制,我尽量不要将整个内容放在一个单独的文本字符串中。基于对宏观实体的定义同样也有类似的限制的怀疑,我也不想把整个事情放在一个单一的定义中。

    大多数C编译器将接受相当大的单个字符列表作为初始值设定项。如果你写

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

    如果你的角色是你自己,你可能会成功。我见过gcc2应用程序,其中有200万个这样的元素(很明显,它们正在加载某种类型的ROM映像)。你甚至可以根据自己的喜好将C_i分为k=100、1000、10000个K字符块,这可能对编译器有帮助。

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

        3
  •  9
  •   Warty    15 年前

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

    这样更干净/更有条理[我假设现在您有一个名为blargh.h的文件,其中包含一个define…]

        4
  •  9
  •   sbi    15 年前

    嗯,把这个字符串存储在一个单独的资源中,然后载入?说真的,在嵌入式土地中,您将把它作为一个单独的资源,而不是保存在RAM中。在Windows上,我相信您可以使用.dlls或其他外部资源来处理这个问题。编译器并不是为您保存这种规模的资源而设计的,它们将失败。

        5
  •  7
  •   amphetamachine    9 年前

    增加编译器堆空间。

        6
  •  5
  •   Community CDub    8 年前

    如果字符串来自大文本或二进制文件,则可以使用 xxd -i 命令(根据ira baxter的答案获取数组中的所有内容)或 bin2obj 命令 .o 你可以链接到程序中的文件)。

    注意,在这种情况下,字符串不能以空结尾。

    见前面问题的答案。 How can I get the contents of a file at build time into my C++ string?

    (另外,作为旁白:注意 .xbm format )

        7
  •  0
  •   Marc    7 年前

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

    这在GCC 4.8中表现得很好:

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

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