派生到MatrixBase <derived>转换背后的故事

时间:2018-01-24 13:58:31

标签: c++ eigen eigen3

将矩阵对象作为MatrixBase引用传递给函数时会发生什么?我不知道幕后真的发生了什么。

示例功能代码为:

#include <Eigen/Core>
#include <iostream>

using namspace Eigen;

template <typename Derived>
void print_size(const MatrixBase<Derived>& b)
{
  std::cout << "size (rows, cols): " << b.size() << " (" << b.rows()
            << ", " << b.cols() << ")" << std::endl;
  std::cout << sizeof(b) << std::endl;
}

int main() {
    Matrix<float, 2, 2> m;
    m << 0.0, 0.1,
         0.2, 0.3;

    print_size(m);
    std::cout << sizeof(m) << std::endl;
}

它提供以下输出:

size (rows, cols): 4 (2, 2)
1
16

16对1差异来自哪里?

还有为什么转换是必要的?

提前致谢!

2 个答案:

答案 0 :(得分:7)

sizeof在编译时进行评估,因此它与声明的(静态)对象类型有关。 b的类型为MatrixBase<Derived>(忽略引用,就像sizeof一样),它很可能是一个空基类,因此大小为1。

另一方面,

m的类型为Matrix<float, 2, 2>,在您的平台上显然大小为16。

我创建了live example来证明sizeof的这种行为。

答案 1 :(得分:3)

sizeof适用于编译时类型。见sizeof

  

当应用于表达式时,sizeof不会对其进行求值   表达式,即使表达式指定了多态   对象,结果是表达式的静态类型的大小。

这意味着无论实例的类型是什么,都会得到MatrixBase<Derived>的大小。

表达式sizeof(b)与您编写sizeof(MatrixBase<Derived>)完全相同。