Экземпляры специализаций Eigen::Matrix
могут храниться либо в куче, либо в стеке
Как указано в принятый ответ , m
имеет автоматическую продолжительность хранения. Однако важно отметить, что последующее утверждение о том, что
Конечно, Eigen::MatrixXd
будет динамически управлять большей частью своей внутренней памяти, но вам не нужно беспокоиться об этом.
в общем случае не применяется к случаям специализаций Eigen::Matrix
, и важно также отметить, что это действительно то, о чем вы, возможно, захотите беспокоиться, особенно если вы работаете в контексте, где динамическая память не разрешена (скажем, встроенная среда).
матрицы динамического размера Eigen
Вы используете матрицу динамического размера (акцент на X
в Eigen::MatrixXd
. Любой тип Eigen::MatrixX...
является просто typedef для Eigen::Matrix< ..., Dynamic , Dynamic >
, где Dynamic
означает, что его размер неизвестен во время компиляции:
const int Eigen::Dynamic
Это значение означает, что положительное количество (например, размер) неизвестно во время компиляции, и что вместо этого значение сохраняется в некоторой переменной времени выполнения.
Собственная документация для Eigen::Matrix
, для которой все Eigen::MatrixX...
являются специализациями, проясняет, что данные динамически изменяемых матриц будут храниться в куче [ emphasis мой]:
Фиксированный размер по сравнению с динамическим:
Фиксированный размер означает, что число строк и столбцов известно
время компиляции. В этом случае Eigen выделяет массив
коэффициенты как массив фиксированного размера , как член класса. ...
Динамический размер означает, что номера строк или столбцов не
обязательно известно во время компиляции. В этом случае они выполняются
переменные, а массив коэффициентов распределяется динамически по
куча .
Матрицы фиксированного размера Eigen
Из первого абзаца, приведенного выше, ясно, однако, что если бы m
была специализацией фиксированного размера Eigen::Matrix
, ее данные были бы (так как она имеет длительность автоматического хранения) сохраняться в куче. Это важная гарантия, например, для проектов, в которых динамическое выделение памяти запрещено (например, встроено).
Действительно, Eigen даже предлагает внутреннюю директиву препроцессора, EIGEN_RUNTIME_NO_MALLOC
, которая может использоваться для запрета любого динамического выделения памяти в модуле Eigen.
Эти макросы в основном предназначены для людей, разрабатывающих Eigen, и для
цели тестирования. Хотя они могут быть полезны для опытных пользователей
и любопытные для целей отладки и тестирования, они не должны
использовать по коду реального слова.
EIGEN_RUNTIME_NO_MALLOC
- если определено, вводится новый переключатель
который можно включить и выключить, позвонив
set_is_malloc_allowed(bool)
. Если malloc
не разрешено и Eigen
в любом случае пытается выделить память динамически, ошибка подтверждения
Результаты. По умолчанию не определено.
Акцент, однако, на " не должен использоваться кодом реального слова" , но он может использоваться пользователями Eigen для целей тестирования.