boost :: multi_array调整异常大小?

时间:2010-03-22 14:27:22

标签: c++ boost boost-multi-array

我试图找出boost :: multi_array构造函数或resize方法是否可以抛出bad_alloc异常(或者指示分配或调整大小失败的其他异常)。我无法在任何地方的文档中找到此信息。

澄清(从评论中添加):

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

3 个答案:

答案 0 :(得分:1)

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

2nd:(评论您的澄清):您确实需要可用物理内存的信息来优化算法在运行时的性能。但是,您不能依赖std::bad_alloc来确定可用的内存量,因为现代操作系统使用 overcommit 这样的东西,这意味着:它们(几乎)永远不会返回失败的分配尝试,而只是给你一些“记忆”,当你真正试图访问它时,它只会失败。

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

如果 需要来针对此类情况进行性能优化算法(这可能是必要的,具体取决于您的工作区域),您需要检查特定于平台的功能,这些功能可以告诉您“现实世界”是怎样的。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

为什么不试试呢?通过一个荒谬的高值来生成异常很容易。

另一方面,如果确实会产生此异常,您打算做什么? std::bad_alloc是一种你通常无法在微观层面上处理的例外......

例如,在Web服务器上,您通常会执行一些清理(在db transaction上回滚?),然后向用户返回500错误。

但是当记忆耗尽时,没有多少你可以安全地做,因为如果你不想再次击中你知道已经接近的记忆墙,你必须谨慎行事:)