Проверьте во время компиляции данные, хранящиеся в Eigen-типе, находятся в памяти - PullRequest
2 голосов
/ 03 апреля 2019

Я пишу некоторый универсальный код, который по-разному обрабатывает выражение Eigen для тех, которые хранят непрерывные данные в памяти, а те - нет.

Я знаю, что во время выполнения это можно сделать, установив 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 Ответ

2 голосов
/ 03 апреля 2019

Флаг, который вы ищете, это LinearAccessBit из DenseBase<>::Flags, и, как указал @ggael, убедитесь, что InnerStrideAtCompileTime равно 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...