В документации Eigen упоминается, что структуры, имеющие векторизуемые типы Eigen фиксированного размера, могут вызвать проблемы с размещением. Они упоминают:
Если вы компилируете в режиме [c++17] только с достаточно новым компилятором (например, GCC>=7, clang>=5, MSVC>=19.12), то обо всем позаботится компилятор, и вы можете остановить чтение.
Означает ли это, что проблема присутствует при компиляции с [c++20], так как они подчеркивают только режим [c++17]? Или проблема решена для любого компилятора, начиная с [c++17]?
Документация довольно ясна: только компиляция в режиме c++17
с последним компилятором (это AND) защищает вас от проблем с выравниванием. Таким образом, использование более свежего компилятора без установки -std=c++17
подвергает вас проблеме. Решение, предложенное в документации, заключается в изменении кода и использовании макроса EIGEN_MAKE_ALIGNED_OPERATOR_NEW
(который пуст для c++17
).
В качестве альтернативы документация предлагает другие, менее навязчивые решения: здесь.
@marco вот как я интерпретирую документацию, да.
Это утверждение основано на P0035R4 (динамическое выделение памяти для данных с избыточным выравниванием), которое было введено в C++ 17, что означает, что утверждение, возможно, справедливо и для C++ 20. Однако с этим утверждением, похоже, связаны некоторые проблемы и подводные камни, даже если следовать рекомендациям руководства Eigen, например. как указано в PointCloudLibrary / pcl / выпуск #4258 .
Интересно, если я правильно понимаю, вы имеете в виду, что всегда нужно добавлять макрос EIGEN_MAKE_ALIGNED_OPERATOR_NEW, независимо от используемого компилятора и версии c++, верно?
@marco EIGEN_MAKE_ALIGNED_OPERATOR_NEW
пуст для С++ 17, как сообщает документация.
Я понимаю, что мне нужен свежий компилятор. Мой вопрос в том, решает ли проблему только С++ 17 или работает и с С++ 20. Итак, если я правильно понимаю, вы говорите, что использование недавнего компилятора и компиляция с С++ 20 подвергают меня этой проблеме. Правильный?