Вопрос или проблема
Я пытаюсь ускорить компиляцию:
https://www.reddit.com/r/cpp/comments/1fmbdl6/comment/lolznmk/?context=3
Вдохновлён:
https://gitlab.com/libeigen/eigen/-/issues/1920
Я пытаюсь сделать, чтобы этот пример работал:
math.ixx
module;
#define EIGEN_NO_STATIC_ASSERT
#include <Eigen/Core>
export module math;
export typedef Eigen::Matrix4d M;
main.cpp
import math;
void main() {
//Eigen::Matrix4f m;
M m;
m.setZero();
m = m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m * m;
На данный момент это не работает (VS22) с ошибкой call_assignment_no_alias, которую, вероятно, нужно экспортировать.
Есть ли простой и элегантный способ экспортировать инстанцирование типов Eigen?
Ответ или решение
Для решения проблемы с экспортом инстанцирований шаблонов Eigen из модуля, вам нужно обратить внимание на то, как Eigen обрабатывает свои типы и операции в контексте контроля ссылок. Поскольку ваш код вызывает проблемы с компиляцией в VS22, отмеченные сообщением об ошибке call_assignment_no_alias
, это указывает на необходимость явного экспорта экземпляров шаблонов Eigen, чтобы компилятор мог понять их и использовать заранее определенные инстанции.
Давайте разберем шаги, необходимые для корректного экспорта типов Eigen в модуле:
-
Создание явных инстанцирований: Вам нужно создать явные инстанцирования типов Eigen, которые вы собираетесь использовать в вашем модуле. Это делается с помощью конструкции
export template
. -
Подключение Eigen: Убедитесь, что вы правильно подключаете заголовочные файлы библиотеки Eigen. В вашем случае, это уже сделано с помощью
#include <Eigen/Core>
. -
Обновление модуля: Ваш модуль
math.ixx
должен быть обновлен с включением явных инстанцирований Eigen. Вот пример, как это можно сделать:
// math.ixx
module;
#define EIGEN_NO_STATIC_ASSERT
#include <Eigen/Core>
export module math;
export typedef Eigen::Matrix4d M;
// Явное инстанцирование шаблонов Eigen
export template class Eigen::Map<Eigen::Matrix<double, 4, 4>>;
- Использование типов в
main.cpp
: В файлеmain.cpp
, вы уже правильно используете типM
. Однако убедитесь, что код выглядит корректно не только для задания нуля, но и для операций, которые вы хотите выполнять. Например:
// main.cpp
import math;
void main() {
M m;
m.setZero();
// Выполнение многоразовых операций на матрице
for(int i = 0; i < 100; ++i) {
m = m * m;
}
}
- Дополнительные параметры компиляции: Учитывайте, что могут потребоваться дополнительные параметры компиляции для разрешения ошибок, связанных с оптимизацией и ссылками.
Если проблема с call_assignment_no_alias
сохраняется, стоит обратиться к документации Eigen о том, как их шаблоны работают с модулями, или настраивать опции компилятора, такие как -fno-strict-aliasing
(если вы используете GCC), для устранения возможных конфликтов.
Такое решение должно помочь вам избежать ошибок компиляции и улучшить время компиляции вашего проекта за счет использования модульного программирования и явных инстанцирований.