包含两个特征向量的C++类具有奇怪的大小.我的问题MWE在这里:
#include#include "Eigen/Core" class test0 { Eigen::Matrix R; Eigen::Matrix T; }; class test1 { Eigen::Matrix R; Eigen::Matrix T; }; class test2 { Eigen::Matrix R; Eigen::Matrix T; }; class test3 { Eigen::Matrix T; }; class test4 { Eigen::Matrix T; }; int main(int argc, char *argv[]) { std::cout << sizeof(test0) << ", " << sizeof(test1) << ", " << sizeof(test2) << ", " << sizeof(test3) << ", " << sizeof(test4) << std::endl; return 0; }
我在我的系统上得到的输出(MacBook Pro,Xcode Clang ++编译器)是:
64,64,48,56,24
类"test1"有一些奇怪的额外填充 - 我原本预计它的大小为56.我不明白它的原因,特别是考虑到其他类都没有任何填充.任何人都可以解释,或者这是一个错误?
这是因为Eigen库的实现方式,并且与编译器技巧无关.后备存储器上Eigen::Matrix
有EIGEN_ALIGN_TO_BOUNDARY(16)
标签,它具有特定于编译器的定义,要求类型在16字节边界上对齐.为了确保这一点,编译器必须在结构的末尾添加8个字节的填充,否则如果你有一个数组,第一个矩阵字段将不会在16字节边界上对齐test1
.
Eigen只是不试图对后备存储施加类似的要求Eigen::Matrix
.
这发生在Eigen/src/Core/DenseStorage
.