如果我想处理数据std::vector
对于 SSE,我需要 16 字节对齐。我怎样才能做到这一点?我需要编写自己的分配器吗?或者默认分配器是否已与 16 字节边界对齐?
C++ 标准需要分配函数(malloc()
and operator new()
)为任何分配适当对齐的内存standard类型。由于这些函数不接收对齐要求作为参数,因此实际上这意味着所有分配的对齐方式都是相同的,并且是具有最大对齐要求的标准类型,这通常是long double
and/or long long
(see 增强 max_align 联合).
向量指令(例如 SSE 和 AVX)比标准 C++ 分配函数具有更强的对齐要求(128 位访问需要 16 字节对齐,256 位访问需要 32 字节对齐)。posix_memalign()
or memalign()
可用于满足具有更强对齐要求的分配。
在 C++17 中分配函数接受类型的附加参数std::align_val_t.
您可以像这样使用它:
#include <immintrin.h>
#include <memory>
#include <new>
int main() {
std::unique_ptr<__m256i[]> arr{new(std::align_val_t{alignof(__m256i)}) __m256i[32]};
}
此外,在 C++17 中,标准分配器已更新以尊重类型的对齐方式,因此您可以简单地执行以下操作:
#include <immintrin.h>
#include <vector>
int main() {
std::vector<__m256i> arr2(32);
}
或者(C++11 中不涉及和支持堆分配):
#include <immintrin.h>
#include <array>
int main() {
std::array<__m256i, 32> arr3;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)