gpt4 book ai didi

c++ - 初始化 2001 x 4001 const float 数组超出堆空间/"CL.exe"退出并出现代码 3 错误

转载 作者:太空狗 更新时间:2023-10-29 23:14:13 26 4
gpt4 key购买 nike

我在具有 8.00 GB RAM 的 Windows 7 x64 操作系统上的 Visual Studio 2013 中使用 C++。

我正在编写一个 DLL,并且有一个 2001 x 4001 的常量 float 数组,用于包含约 800 万个值的大型查找表,这应该是 32 MB。

当我在没有使用值初始化表的情况下进行编译以及当我尝试通过初始化大约 1400 x 4001 的值进行编译时,一切正常。

但是,当我尝试初始化整个 2001 x 4001 表时,我得到:

c1060 编译器出现堆空间不足错误。

我已将/Zm200(和/Zm1000)添加到命令行选项,但随后错误变为:

C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets(341,5):错误 MSB6006:“CL.exe”退出,代码为 3。

我在 Debug 和 Release 中试过并得到相同的结果。

不幸的是,我找不到任何关于这个特定错误的有用信息。

我不确定去哪里找,但 32 MB 似乎不是一个过多的内存量,即使是这样,如果默认的/Zm100 足够的话,/Zm1000 不会提供足够的内存吗将近 3/4 的 table ?

最后,DLL的绝大部分是表。总共还有大约 150 行其他代码,但任何时候只有少数标准变量(int、double 等)在范围内。

数组的定义如下:

static SKEWLOGISTICFUNCTIONSDLL_API const int shapeValues = 2001; // Enough for 0.000 to 2.000 in increments of 0.001
static SKEWLOGISTICFUNCTIONSDLL_API const int distanceValues = 4001; // Enough for -2.000 to 2.000 in increments of 0.001

static SKEWLOGISTICFUNCTIONSDLL_API const float skewLogisticTable[shapeValues][distanceValues];

这是大表的开始:

    const float MySkewLogisticFunctions::skewLogisticTable[shapeValues][distanceValues] =
{
// Shape going down --> 0.000 to 2.000 in increments of 0.001
// Distance going across --> -2.000 to 2.000 in increments of 0.001
{ 0.119203, 0.119308, 0.119413, . . .

最佳答案

编译器可能正在尝试优化这些数据,这会占用更多内存。 GCC 能够用这么大的数组编译测试程序,但要占用 ~2.5GiB 的内存才能做到这一点。 Visual Studio 可能会做同样的事情,所以/Zm1000 实际上是不够的。

有其他方法可以将数据 block 存储在二进制文件中,但它们都不是跨平台的。使用 Visual Studio,实现它的方法是使用资源文件。在 GNU 工具链中,使用了 objcopy。这会将 blob 粘贴到二进制的数据段中,然后将 C++ 代码链接到标记二进制 blob 的符号。这避免了让编译器试图弄乱大量数据。请参阅这篇文章了解如何实际操作:https://stackoverflow.com/a/17441467/5790674 .

关于c++ - 初始化 2001 x 4001 const float 数组超出堆空间/"CL.exe"退出并出现代码 3 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34774418/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com