[英]C++ Eigen Matrix clarifications
我最近才开始探索C ++ Eigen库,并对一些文档感到有些困惑。 如果有人能澄清这一点,那就太棒了。
在常见的陷阱( https://eigen.tuxfamily.org/dox-devel/TopicPitfalls.html ) 对齐问题部分,它说“确实,自C ++ 17以来,C ++对显式数据对齐没有足够的支持“。
关于如何摆脱对齐问题的页面( https://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html#getrid ),文档说,“如果你只能用一个目标[c ++ 17]最近的编译器(例如,GCC> = 7,clang> = 5,MSVC> = 19.12),那么你很幸运:启用c ++ 17就足够了“。
因此,如果我使用c ++ 17和gcc> = 7.0,那么对齐不是Eigen Matrix的问题吗? 我明白了吗? 并且不需要宏EIGEN_MAKE_ALIGNED_OPERATOR_NEW? 如果这是正确的,c ++ 14 / c ++ 17之间有什么不同,它会处理对齐问题?
第二个问题是关于传值的部分( https://eigen.tuxfamily.org/dox-devel/group__TopicPassingByValue.html )。 该文档声称,按值传递可能是非法的,并可能导致程序崩溃。 这对我来说非常令人费解。 不会传递值只是调用复制构造函数? 举个例子。
Eigen::Vector3f veca = ComputeVecA();
Eigen::Vector3f vecb = veca; //< If pass-by-value is unsafe, is this operation safe?
在常见的陷阱( https://eigen.tuxfamily.org/dox-devel/TopicPitfalls.html ) 对齐问题部分,它说“确实,自C ++ 17以来,C ++对显式数据对齐没有足够的支持“。
这似乎是一个错字。 它应该说“直到C ++ 17”而不是“自C ++ 17以来”,因为C ++ 17实际上增加了对具有非凡对齐限制的分配的支持。 两条 评论同意我的观点 。
关于如何摆脱对齐问题的页面( https://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html#getrid ),文档说,“如果你只能用一个目标[C ++ 17]最近的编译器(例如,GCC> = 7,Clang> = 5,MSVC> = 19.12),那么你很幸运:启用C ++ 17就足够了。“
因此,如果我使用C ++ 17并且gcc> = 7.0,那么对齐不是Eigen Matrix的问题吗? 我明白了吗? 并且不需要宏
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
?
是。
如果这是正确的,C ++ 14 / C ++ 17之间有什么不同,它会处理对齐问题?
C ++ 17支持过度对齐数据的动态内存分配 。 operator new
现在可以使用align_val_t
参数正确分配过度对齐的内存。
第二个问题是关于传值的部分( https://eigen.tuxfamily.org/dox-devel/group__TopicPassingByValue.html )。 该文档声称,按值传递可能是非法的,并可能导致程序崩溃。 这对我来说非常令人费解。 不会传递值只是调用复制构造函数?
如果变量是局部变量(在示例中为vecb
),则编译器和库会注意确保vecb
满足Eigen所需的特殊对齐限制。 但是,如果变量是函数参数,则不遵守此对齐限制,这意味着程序可能在不对齐的内存上运行,从而崩溃。 (这与复制构造函数没什么关系。)
最后,我可以依靠RVO / NRVO作为特征固定大小的矩阵类吗? 我怀疑答案是肯定的。
对于Eigen类和其他类,答案几乎相同:试试看。 通常答案是肯定的。
Q1:正如已经评论的那样,在为c ++ 17更新此段落时,这是一个错字。 这已经修复了。
Q2:我不记得有关这个的所有细节,但它与两个技术问题有关。
alignas
关键字的使用这不再是一个问题,但也许这仍然是一些alignas
编译器alignas
组合的问题。 问题3:没有什么可以阻止RVO / NRVO,根据我的经验,它可以应用它确实适用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.