C ++特征矩阵说明

cpl*_*rat 5 c++ eigen eigen3 c++17

我直到最近才开始探索C ++ Eigen库,并对某些文档感到有些困惑。如果有人可以澄清这一点,那就太好了。

  1. 在常见的陷阱(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应该就足够了。

    那么如果我在gcc> = 7.0的情况下使用c ++ 17,对齐就不是Eigen Matrix的问题吗?我了解这个权利吗?并且不需要宏EIGEN_MAKE_ALIGNED_OPERATOR_NEW吗?如果这是正确的,那么负责对齐问题的c ++ 14 / c ++ 17有什么区别?

  2. 第二个问题与值传递部分有关(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?
Run Code Online (Sandbox Code Playgroud)
  1. 最后,对于本征固定大小的矩阵类,我可以依靠RVO / NRVO吗?我怀疑答案是肯定的。

gga*_*ael 2

  • Q1:正如已经评论过的,这是在为 c++17 更新此段落时的一个拼写错误。这已经是固定的了。

  • Q2:我不记得这件事的所有细节,但它与两个技术问题有关。

    1. 有些编译器无法正确对齐堆栈,在这种情况下,无法获得对齐的函数参数。
    2. 旧的 ABI 规范不允许函数参数过度对齐。我希望自从 c++11 和标准化alignas关键字的使用以来,这不再是问题,但也许这在某些奇异的编译器操作系统组合上仍然是一个问题。
  • Q3:没有什么可以阻止 RVO/NRVO,根据我的经验,当它可以应用时,它确实适用。