【问题标题】:Reallocating matrix from unmanaged to managed将矩阵从非托管重新分配到托管
【发布时间】:2012-03-26 20:16:03
【问题描述】:

我一直试图让一段代码重新分配一个巨大的非托管矩阵结构(即std::vector<std::vector<T> >)到一个等效的托管结构(cli::array<T,2>)。由于我不能同时将两个结构都保存在内存中,我选择写入文件并读回结构。问题是,一旦我删除了原始矩阵,尝试为矩阵分配托管内存的内存就会失败。

我认为这可能与不同运行时 cpp 与 clr 的堆有关。但是找不到具体的细节。 cpp 运行时是否有可能保留堆空间,从而阻止 clr 堆重新分配矩阵?如果是这样,是否可以强制 cpp 运行时清理堆空间以便为 clr 堆腾出空间。

现在澄清一下,目标矩阵必须是二维数组,而不是锯齿状数组。我知道这有无法调整大小的问题。否则我也许可以将矩阵移动更小的块。

谢谢,提前。

【问题讨论】:

  • 不能使用锯齿状数组是一个相当人为的限制。它确实解决了您的地址空间碎片问题。 64 位操作系统是简单的解决方法。

标签: .net c++-cli heap-memory


【解决方案1】:

如果你不能同时在内存中拥有两者,我猜这个数组的大小超过了一个千兆字节。如果你想把它放在一个托管的矩形(非锯齿状)数组中,CLR 必须找到 1 GB 的连续内存......这很容易失败。

您是否尝试过运行 64 位版本或声明为“大地址感知”的 32 位版本?如果在 64 位 Windows 机器上运行,后者将为您提供 4 GB 的地址空间,它可能适合。

【讨论】:

  • 我实际上正在与标志 /largespaceaware 链接。目前正在考虑切换到 64 位,但并非所有正在运行的机器都是 64 位的。 CLR 是否需要连续内存?我认为虚拟地址系统会处理这个问题,就像刚刚释放的 vector 一样。
  • 二维数组在内存中是连续的(在您的应用程序地址空间中)。您的地址空间可能会被 C++ 代码中的分配碎片化。考虑在单独的进程中运行您的 C++ 代码。无论如何,您正在创建一个文件来传输数据。
猜你喜欢
  • 2011-10-30
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多