我试图找出如果提升::multi_array的构造或调整方法可以引发bad_alloc异常(或其他某些例外表示的分配或调整失败).我不能找到这个信息在该文件的任何地方。

澄清(加评论):

这是一个科学算法,可以降回到一个较少的内存密集的(较慢)法,如果分配失败。基本上有两种动态分配的3-维数组举行"远距离"(相关)之间的所有对基因的查询和所有基因的交叉验证设置为每一个大数量的数据集。较慢的方法重新计算每个距离上的飞行,因为它是必要的。这是用C++版本的现有Java实施,其实施这两种方法,并将回落出来的记忆除外。我真的不希望出现的记忆。

有帮助吗?

解决方案

1 的(回答真正的问题),因为它使用动态分配的内存,是的,它可以抛出std::bad_alloc(我从来没有见过升压转换std::bad_alloc例外,那将是疯狂的这样做)

2日:的(在你的澄清意见):你确实需要的可用物理内存的信息来优化你的算法在运行时的性能。但是,你不能依靠std::bad_alloc,以确定您有多少内存可用,现代操作系统都使用这样的东西的过量使用的,这意味着:他们(几乎)永远不会返回分配失败的尝试,而只是给你一些“记忆”,这将不仅不能跳进存在当你真正尝试访问它。

在Java作为虚拟机正在做许多事情,你可以这么写:它试图分配一些连续的内存块,并且相对于这样做的可用物理内存,可用的的物理内存决定是否应该更强调GC或仅分配较大的垃圾。此外,出于性能原因,你需要考虑到虚拟内存和物理内存是完全不同的概念。

如果您的需要的性能,优化您的这种情况下,算法(这很可能是必要的,这取决于你的工作区),您需要检查您的特定平台的功能,这可以告诉你如何“真实世界”的模样。

其他提示

没有明确的除外规定是有意的。看看 副部分作出解释。此外,请注意,一个没有明确说明指的是没有限制的异常类型的功能可以扔掉。因此,至少,构造函数和调整功能的可以扔掉例外情况下存耗尽,或者如果一个项目复制失败。

一些通用参考文献,它启发的提升,这你可能会感兴趣的是:

为什么不对其进行测试?这很容易通过荒谬高的值,以产生该异常。

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

例如,在一个网络服务器中,一般会进行一些清理(回退上分贝交易?),然后返回一个错误500给用户。

但是,当内存被耗尽,有没有什么可以安全地完成,因为你必须谨慎行事,如果你不想再一次击中了内存墙,你知道是接近:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top