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

Check at compile time the data held by Eigen type is contiguous in memory

本文关键字:数据 内存 连续 是否 保存 编译 检查 特征 类型      更新时间:2023-10-16

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

我知道在运行时,这可以通过检查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指出的那样,由于它涉及运行时信息,这只能在运行时完成,但我想尽可能多地利用编译时信息来"缩短"该过程。

您要查找的标志是 DenseBase<>::FlagsLinearAccessBit ,正如@ggael指出的那样,请确保InnerStrideAtCompileTime等于 1