Собственная матрица создается автоматически в куче? - PullRequest
2 голосов
/ 03 мая 2019

Этот вопрос может быть глупым, но я новичок.Когда я создаю Eigen :: MatrixXd в локальной области видимости, такой как:

    void foo(){
        Eigen::MatrixXd m(rows,cols);
        // do stuff
    }

Будет ли объект находиться в куче или стеке?Я ожидаю, что он будет в стеке, так как я не использую ключевое слово 'new'.

Ответы [ 2 ]

3 голосов
/ 03 мая 2019

m имеет длительность автоматического хранения , как и любой другой тип, объявленный таким образом.

Конечно, Eigen::MatrixXd будет динамически управлять большей частью внутренней памяти, но вам не нужнопозаботиться об этом.

1 голос
/ 12 мая 2019

Экземпляры специализаций 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 для целей тестирования.

...