| namespace Eigen { |
| |
| /** \page UnalignedArrayAssert Troubleshooting - Explanation of the assertion on unaligned arrays |
| |
| Hello! You are seeing this webpage because your program terminated on an assertion failure like this one: |
| <pre> |
| my_program: path/to/eigen2/Eigen/src/Core/MatrixStorage.h:44: |
| Eigen::ei_matrix_array<T, Size, MatrixOptions, Align>::ei_matrix_array() |
| [with T = double, int Size = 2, int MatrixOptions = 2, bool Align = true]: |
| Assertion `(reinterpret_cast<size_t>(array) & 0xf) == 0 && "this assertion |
| is explained here: http://eigen.tuxfamily.org/dox/UnalignedArrayAssert.html |
| **** READ THIS WEB PAGE !!! ****"' failed. |
| </pre> |
| |
| There are 3 known causes for this issue. Please read on to understand them and learn how to fix them. |
| |
| \b Table \b of \b contents |
| - \ref c1 |
| - \ref c2 |
| - \ref c3 |
| - \ref explanation |
| |
| \section c1 Cause 1: Structures having Eigen objects as members |
| |
| If you have code like this, |
| |
| \code |
| class Foo |
| { |
| //... |
| Eigen::Vector2d v; |
| //... |
| }; |
| //... |
| Foo *foo = new Foo; |
| \endcode |
| |
| then you need to read this separate page: \ref StructHavingEigenMembers "Structures Having Eigen Members". |
| |
| Note that here, Eigen::Vector2d is only used as an example, more generally the issue arises for all \ref FixedSizeVectorizable "fixed-size vectorizable Eigen types". |
| |
| \section c2 Cause 2: STL Containers |
| |
| If you use STL Containers such as std::vector, std::map, ..., with Eigen objects, like this, |
| |
| \code |
| std::vector<Eigen::Matrix2f> my_vector; |
| std::map<int, Eigen::Matrix2f> my_map; |
| \endcode |
| |
| then you need to read this separate page: \ref StlContainers "Using STL Containers with Eigen". |
| |
| Note that here, Eigen::Matrix2f is only used as an example, more generally the issue arises for all \ref FixedSizeVectorizable "fixed-size vectorizable Eigen types" and \ref StructHavingEigenMembers "structures having such Eigen objects as member". |
| |
| \section c3 Cause 3: Passing Eigen objects by value |
| |
| If some function in your code is getting an Eigen object passed by value, like this, |
| |
| \code |
| void func(Eigen::Vector4d v); |
| \endcode |
| |
| then you need to read this separate page: \ref PassingByValue "Passing Eigen objects by value to functions". |
| |
| Note that here, Eigen::Vector4d is only used as an example, more generally the issue arises for all \ref FixedSizeVectorizable "fixed-size vectorizable Eigen types". |
| |
| \section explanation General explanation of this assertion |
| |
| \ref FixedSizeVectorizable "fixed-size vectorizable Eigen objects" must absolutely be created at 16-byte-aligned locations, otherwise SIMD instructions adressing them will crash. |
| |
| Eigen normally takes care of these alignment issues for you, by setting an alignment attribute on them and by overloading their "operator new". |
| |
| However there are a few corner cases where these alignment settings get overridden: they are the possible causes for this assertion. |
| |
| */ |
| |
| } |