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

Onu*_*urA 4 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;
}
Run Code Online (Sandbox Code Playgroud)

它给出了以下输出:

size (rows, cols): 4 (2, 2)
1
16
Run Code Online (Sandbox Code Playgroud)

16对1差异来自哪里?

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

提前致谢!

Rei*_*ica 7

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

m另一方面,它是一种类型Matrix<float, 2, 2>,在你的平台上显然有16号.

我已经创建了一个演示此行为的实例sizeof.

  • 应用于引用的@TeamUpvote sizeof返回引用类型的大小.这就是它的定义方式. (3认同)
  • @OnurA唯一的隐式转换是绑定时的派生到基础*引用*转换.实际上,它只是静态与动态类型的情况.查看我添加到答案中的实例. (3认同)
  • @OnurA完全正确.正如答案所说,`sizeof`忽略了引用(也就是说,它为`T`提供了完全相同的值,对于任何`T`提供了`T&`. (2认同)