c++ - vector 的数据如何对齐?

标签 c++ vector sse memory-alignment allocator

如果我想用 SSE 处理 std::vector 中的数据,我需要 16 字节对齐。我怎样才能做到这一点?我需要编写自己的分配器吗?还是默认分配器已经与 16 字节边界对齐?

最佳答案

C++ 标准要求分配函数(malloc()operator new())为任何 standard 类型分配适当对齐的内存。由于这些函数不接收对齐要求作为参数,实际上这意味着所有分配的对齐方式是相同的,并且是具有最大对齐要求的标准类型,通常是 long double 和/或 long long(参见 boost max_align union)。

vector 指令,如 SSE 和 AVX,比标准 C++ 分配函数提供的对齐要求更强(16 字节对齐用于 128 位访问,32 字节对齐用于 256 位访问)。 posix_memalign()memalign() 可用于满足此类具有更强对齐要求的分配。


在 C++17 中,allocation functions接受 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;
}

关于c++ - vector 的数据如何对齐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8456236/

相关文章:

c++ - vector <pair<int,int>>v(size);打印时显示 0 作为值

c++ - 实现定义为使用保留 vector 而不调整它的大小?

c++ - 与直接编译的可执行文件相比,linux .so 性能下降

c++ - 我可以更改 Code::Blocks 自动缩进的行为吗?

C++ Builder 如何用 vector 构建动态对象?

c - SSE 中的 Seg 错误,不确定是什么原因造成的

c - 使用 vector 扩展时让 GCC 生成 PTEST 指令

c++ - 尝试在 SSE 编程中使用和掩码添加 __m128

c++ - 如何为大量 header 生成 .pch?

c++ - 使用 C++ 将图像写入 RabbitMQ 队列