对齐、矢量化和性能调整 EIGEN_MALLOC_ALREADY_ALIGNED可以设置为 0 或 1 来判断默认系统 malloc 是否已返回对齐的缓冲区。如果未定义,则此信息会自动从编译器和系统预处理器标记中推导出来。 EIGEN_MAX_ALIGN_BYTES必须是2的乘方或0。定义了Eigen可以将动态和静态分配的数据在内存边界上对齐的上限,以字节为单位。...
假设代码已被单元测试很好地覆盖,那么可以通过将其链接到仅返回 8 字节对齐缓冲区的自定义 malloc 库来检查对齐安全性。这样所有对齐的问题都会暴漏。为此,还必须使用EIGEN_MALLOC_ALREADY_ALIGNED=0编译程序。
也就是如果NeedsToAlign为true,那么就要求内存对齐,否则无需对齐。你可以调试跟进去看看 conditional_aligned_malloc的源码啊。
更进一步,如果4个double是一种经常使用的数据类型的话,我们就可以把它封装为一个Vector4d类,这样,用户就完全看不到内存对齐的具体实现了,像下面这样。 #include<immintrin.h>#include<iostream>classVector4d{usingaligned_double4=__attribute__((aligned(32)))double[4];public:Vector4d(){}Vector4d(doubled1,...
C++提供的new关键字是个好东西,它避免了C语言中丑陋的malloc操作,但同时也隐藏了实现细节。如果我们翻看C++官方文档,可以发现new Vector4d实际上做了两件事情,第一步申请sizeof(Vector4d)大小的空间,第二步调用Vector4d的构造函数。要想实现内存对齐,我们必须修改第一步申请空间的方式才行。好在第一步其实调用了ope...