c++ - boost::multi_array 调整大小异常?

标签 c++ boost boost-multi-array

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

澄清(从评论中添加):

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

最佳答案

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

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

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

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

关于c++ - boost::multi_array 调整大小异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2492943/

相关文章:

C++0x 性能改进

c++ - 在 boost::deadline_timer 上创建包装器,无法将参数传递给处理函数

c++ - buffered_stream::buffered_stream 构造函数中的 Arg & a 是什么?

c++ - 如何从 boost 多数组中获取最大/最小元素

c++ - Boost::multi_array 循环

c++ - Shedskin - 编译错误

c++ - 如何将我自己的智能指针传递给函数?

c++ - Eclipse反汇编 View ,可以在不调试程序的情况下查看反汇编吗?

c++ - 这是 Visual Studio 2013 update 4 C++ 优化器错误还是我的代码有误?

c++ - 初始化 const boost multi_array