Сохраняются ли проблемы выравнивания памяти с Eigen, перечисленные в документации, в C++11? Кажется, что C++11 уже может позаботиться о правильном выравнивании объектов в стеке и в куче с помощью alignas
и std::allocator
, которые поддерживают выравнивание.
Проблемы с собственным выравниванием
- Вы говорите о той части документации, которая ссылается на ошибку gcc? 20.05.2015
- Кроме того, вы не можете передать объект Eigen по значению, необходимо использовать настраиваемый распределитель для контейнера, специальный
std::vector
и макрос для перегрузкиoperator new
в классах, содержащих объекты Eigen. Потому что в С++ 11 выравнивание памяти, по-видимому, поддерживается для памяти стека и кучи. 20.05.2015
Ответы:
Да, проблемы с выравниванием все еще присутствуют в C++11. Спецификатор alignas
не влияет на динамические выделения, которые, таким образом, все еще могут вызывать несоответствия, приводящие к утверждениям, выдаваемым Eigen.
Вам придется продолжать использовать средства, которые Eigen предоставляет для выровненного распределения, такие как EIGEN_MAKE_ALIGNED_OPERATOR_NEW
для размещения объектов или Eigen::aligned_allocator<T>
для выравнивания контейнеров.
Хотя вопрос касается конкретно C++11, стоит отметить, что комбинация грядущей версии Eigen 3.4 с компилятором, совместимым с C++17, избавит нас от необходимости использовать EIGEN_MAKE_ALIGNED_OPERATOR_NEW
и Eigen::aligned_allocator<T>
. Тогда прежний макрос на самом деле даже пустой. Это возможно благодаря новой форме operator new
, которая специально разработана для поддержки выравнивания.