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

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

最佳答案

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

关于c++ - 编译时检查 Eigen 类型保存的数据在内存中是否连续,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55484927/

10-11 23:17
查看更多