Nel mio progetto ho cambiato il tipo di punto utilizzato da Eigen::Vector2f
a Eigen::Vector2d
e ho riscontrato problemi di allineamento.Perché gli elenchi di inizializzatori non sono disponibili quando si modifica l'allocatore di std :: vector?
Ecco una versione semplificata del codice:
#include <vector>
#include <Eigen/Eigen>
int main()
{
std::vector<Eigen::Vector2d> points = { {0,0}, {0,1} };
}
sto ottenendo il seguente errore fase di esecuzione:
eigen3/Eigen/src/Core/DenseStorage.h:78: Eigen::internal::plain_array<double, 2, 0, 16>::plain_array() [T = double, Size = 2, MatrixOrArrayOptions = 0, Alignment = 16]: Assertion `(reinterpret_cast<size_t>(array) & 0xf) == 0 && "this assertion is explained here: " "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" " **** READ THIS WEB PAGE !!! ****"' failed.
Come l'asserzione-messaggio suggerito, ho letto la richiesta alignment of Fixed-size vectorizable Eigen objects . E anche la sottosezione su STL Containers. E sembra che ho due opzioni:
- uso del
Eigen::aligned_allocator
- o utilizzare la macro
EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION
.
Entrambi i tentativi non vengono compilati (testati con GCC 4.8.3 e Clang 3.5) poiché il compilatore non è in grado di convertire correttamente l'elenco di inizializzazione.
Ecco il codice alterato:
#include <vector>
#include <Eigen/Eigen>
#include <Eigen/StdVector>
// EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Eigen::Vector2d)
int main()
{
std::vector<Eigen::Vector2d, Eigen::aligned_allocator<Eigen::Vector2d>> points = { {0,0}, {0,1} };
// std::vector<Eigen::Vector2d> points = { {0,0}, {0,1} };
}
GCC uscita di errore:
error: could not convert ‘{{0, 0}, {0, 1}}’ from ‘<brace-enclosed initializer list>’ to ‘std::vector<Eigen::Matrix<double, 2, 1>, Eigen::aligned_allocator<Eigen::Matrix<double, 2, 1> > >’
Quindi mi chiedo:
Perché sono liste di inizializzazione non è disponibile quando si cambia l'allocatore del
std::vector
?- È dovuto all'allineamento?
- Posso allineare in qualche modo l'elenco di inizializzatore?
Perché la versione di specializzazione non funziona?
- Questi mancano della funzionalità di elenco di inizializzazione?