3

我试图弄清楚 boost::multi_array 构造函数或 resize 方法是否会引发 bad_alloc 异常(或其他一些指示分配或调整大小失败的异常)。我在任何地方的文档中都找不到此信息。

澄清(从评论中添加):

这是一种科学算法,如果分配失败,它可以退回到内存密集度较低(较慢)的方法。基本上,有两个动态分配的 3 维数组来保存查询中所有基因对之间的“距离”(相关性),以及针对大量数据集中的每一个的交叉验证集中的所有基因。较慢的方法会根据需要重新计算每个距离。这是针对现有 Java 实现的 C++ 版本的,它实现了这两种方法,并且会退回到内存不足异常。我真的不希望内存不足。

4

3 回答 3

1

第一:(回答真正的问题):因为它使用动态分配的内存,是的,它可以抛出std::bad_alloc(我从未见过提升翻译std::bad_alloc异常;这样做会很疯狂)。

第二:(评论您的澄清):您确实需要可用物理内存的信息来优化算法在运行时的性能。但是,您不能依靠std::bad_alloc来确定您有多少可用内存,因为现代操作系统使用诸如overcommit之类的东西,这意味着:它们(几乎)从不返回失败的分配尝试,而只是给您一些“内存”,这只有在您实际尝试访问它时才会出现。

在 Java 中,这可能会起作用,因为 VM 正在为您做很多事情:它尝试分配一些连续的内存块,并根据可用的物理内存和可用的未使用物理内存来决定是否应该对 GC 施加更多压力或者只是分配一个更大的垃圾。此外,出于性能原因,您需要考虑到虚拟内存和物理内存是完全不同的概念。

如果您需要针对这种情况对算法进行性能优化(这很可能是必要的,具体取决于您的工作领域),您需要检查特定于平台的函数,这些函数可以告诉您“真实世界”的样子。

于 2010-03-22T14:48:44.870 回答
0

没有明确的异常规范是有意的。有关说明,请参见小节。此外,请注意,没有明确的规范意味着对函数可以抛出的异常类型没有限制。因此,至少,在内存耗尽或项目对象复制失败的情况下,ctor 和 resize 函数可以抛出异常。

您可能感兴趣的一些启发 Boost 的通用参考是:

于 2010-03-22T14:46:27.060 回答
0

为什么不测试呢?很容易传递一个高得离谱的值来生成异常。

另一方面,如果确实产生了这个异常,你打算做什么?std::bad_alloc是那种你通常无法在微观层面处理的异常......

例如,在网络服务器上,您通常会执行一些清理(回滚数据库事务?),然后500向用户返回错误。

但是当内存耗尽时,您可以安全地做很多事情,因为如果您不想再次撞到您知道靠近的内存墙,则必须小心行事:)

于 2010-03-22T15:54:34.187 回答