C++ 特征矩阵说明
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),文档说,"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 之间有什么不同?
第二个问题是关于传值部分(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?
- 最后,我可以依赖 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 data。 operator 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:我不记得关于这个的所有细节,但它与两个技术问题有关。
- 有些编译器无法正确对齐堆栈,在这种情况下无法获得对齐的函数参数。
- 旧的 ABI 规范不允许函数参数过度对齐。
我希望自从 c++11 和标准化
alignas
关键字的使用以来,这不再是一个问题,但也许这在一些奇异的编译器-OS 组合上仍然是一个问题。
Q3:没有什么可以阻止RVO/NRVO,根据我的经验,当它可以应用时它确实适用。
我最近才开始探索 C++ Eigen 库,对某些文档感到有些困惑。如果有人能澄清这一点就太好了。
在常见的陷阱(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 之间有什么不同?
第二个问题是关于传值部分(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?
- 最后,我可以依赖 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 data。 operator 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:我不记得关于这个的所有细节,但它与两个技术问题有关。
- 有些编译器无法正确对齐堆栈,在这种情况下无法获得对齐的函数参数。
- 旧的 ABI 规范不允许函数参数过度对齐。
我希望自从 c++11 和标准化
alignas
关键字的使用以来,这不再是一个问题,但也许这在一些奇异的编译器-OS 组合上仍然是一个问题。
Q3:没有什么可以阻止RVO/NRVO,根据我的经验,当它可以应用时它确实适用。