namespace Eigen {

/** \page UnalignedArrayAssert 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/api/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".

\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.

*/

}
