编译时检查本征类型保存的数据在内存中是否连续

时间:2019-04-02 23:32:57

标签: c++ eigen eigen3

我正在编写一些通用代码,对于那些在内存中存储连续数据的人和那些不连续存储数据的人,本征代码将以不同的方式处理本征表达式。

我知道在运行时可以通过检查expr.innerSize() == expr.outerStride() && expr.innerStride() == 1来完成此操作,但是我想知道是否可以在编译时完成?

==编辑== 此检查的目的是允许在通用代码中为表达式xpr执行以下操作:

// c++20
if (is_linear_accessible(xpr.data(), size)) {
    auto buffer = std::span(xpr.data(), size);
    // work with buffer safely
    // ...
} else {
   auto tmp = xpr.eval();
   // work with tmp.data()
   // ...
}

这样,我可以将数据传递给在原始缓冲区上工作的其他库。正如@JaMiT指出的那样,由于它涉及运行时信息,因此只能在运行时完成,但是我想尽可能多地利用编译时信息来“简化”进程。

1 个答案:

答案 0 :(得分:2)

您要查找的标志是LinearAccessBit中的DenseBase<>::Flags,并且正如@ggael所指出的,请确保InnerStrideAtCompileTime等于1