识别 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 创建分段错误

临时对象创建

既然 objectID 在临时对象和永久对象之间发生变化,如何有效地处理 Core Data 中的临时对象?

为啥当我们有 const 引用时创建临时对象?

在声明然后分配对象的情况下创建的临时对象

通过构造函数隐式类类型转换创建的临时对象啥时候被销毁