C++ 特征矩阵说明

C++ Eigen Matrix clarifications

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

  1. 在常见的陷阱(https://eigen.tuxfamily.org/dox-devel/TopicPitfalls.html对齐问题部分,它说“确实,自C++17以来,C++没有对显式数据对齐的支持非常好。”。

    关于如何消除对齐问题的页面 (https://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html#getrid),文档说,"If you can target [c++17] only with a recent compiler (e.g., GCC>=7, clang>=5, MSVC>=19.12), then you're lucky: enabling c++17 should be enough"。

    如果我使用 gcc>=7.0 的 c++ 17,对齐不是特征矩阵的问题吗?我理解对了吗?并且不需要宏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?
  1. 最后,我可以依赖 RVO/NRVO 来获得 Eigen 固定大小的矩阵 class 吗?我怀疑这个问题的答案是肯定的。

In the common pitfalls (https://eigen.tuxfamily.org/dox-devel/TopicPitfalls.html) Alignment Issues section, it says "Indeed, since C++17, C++ does not have quite good enough support for explicit data alignment."

这似乎是一个错字。它应该说 "until C++17" 而不是 "since C++17" 因为 C++17 实际上 添加了 支持具有特殊对齐限制的分配。 同意我的看法。

The page on how to get rid of alignment issues (https://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html#getrid), the documentation says, "If you can target [C++17] only with a recent compiler (e.g., GCC >= 7, Clang >= 5, MSVC >= 19.12), then you're lucky: enabling C++17 should be enough."

So is alignment not an issue with Eigen Matrix if I am using C++17 with gcc >= 7.0? Have I understood this right? And that the macro EIGEN_MAKE_ALIGNED_OPERATOR_NEW won't be needed?

是的。

And if this is correct, what is different between C++14/C++17 which takes care of the alignment issues?

C++17 支持 Dynamic memory allocation for over-aligned dataoperator new 现在可以使用 align_val_t 参数正确分配过度对齐的内存。

The second question is regarding the pass-by-value section (https://eigen.tuxfamily.org/dox-devel/group__TopicPassingByValue.html). The documentation claims that pass-by-value could be illegal and could crash the program. This is very puzzling to me. Wouldn't pass-by-value just invoke a copy constructor?

如果变量是局部变量(如示例中的 vecb),则编译器和库会注意确保 vecb 满足 Eigen 要求的特殊对齐限制。但是,如果变量是函数参数,则不遵守此对齐限制,这意味着程序可能会在对齐错误的内存上运行,从而导致崩溃。 (这与复制构造函数关系不大。)

And lastly, can I rely on RVO/NRVO for Eigen fixed sized matrix class? I suspect the answer to this is yes.

Eigen 类 和其他 类 的答案几乎相同:试试看。通常答案是肯定的。

  • Q1:如前所述,这是为 c++17 更新此段落时的错字。这已经修复了。

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

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