识别 Eigen 中的临时对象创建
Posted
技术标签:
【中文标题】识别 Eigen 中的临时对象创建【英文标题】:Identifying temporary object creation in Eigen 【发布时间】:2018-10-21 18:23:30 【问题描述】:正如 Eigen C++ 库中的文档在许多地方指出的那样,为了在计算时间方面获得最大性能,我们需要尽可能避免使用临时对象。在我的应用程序中,我处理动态大小矩阵。我想知道在我的计算中创建临时矩阵。有没有通用的方法来识别临时矩阵的创建?
例如,
Eigen::MatrixXf B, C, D;
....some initialization for B, C, D
Eigen::MatrixXf A = B*C+D;
在实现这个操作的同时,如何查看创建了多少临时矩阵?
【问题讨论】:
【参考方案1】:您可以为此使用插件机制。在包含任何 Eigen 标头之前,请定义以下内容:
static long int nb_temporaries;
static long int nb_temporaries_on_assert = -1;
inline void on_temporary_creation(long int size)
// here's a great place to set a breakpoint when debugging failures in this test!
if(size!=0) nb_temporaries++;
if(nb_temporaries_on_assert>0) assert(nb_temporaries<nb_temporaries_on_assert);
#define EIGEN_DENSE_STORAGE_CTOR_PLUGIN on_temporary_creation(size);
这种机制在测试套件中的多个地方使用,最明显的是product_notemporary.cpp
。
如果您最关心临时内存分配,您也可以通过使用-DEIGEN_RUNTIME_NO_MALLOC
编译并使用Eigen::internal::set_is_malloc_allowed(bool);
允许/禁止动态分配来检查它
【讨论】:
以上是关于识别 Eigen 中的临时对象创建的主要内容,如果未能解决你的问题,请参考以下文章
Boost::python 和 Eigen/dense 创建分段错误