C++ c++;将数据存储在对齐阵列的中间 #包括 #包括 #包括 使用名称空间std; int main() { alignas(32)int32_t a[32]; __m256i t256(_mm256_setzero_si256()); _mm256_存储_si256(重新解释铸造(a),t256); cout

C++ c++;将数据存储在对齐阵列的中间 #包括 #包括 #包括 使用名称空间std; int main() { alignas(32)int32_t a[32]; __m256i t256(_mm256_setzero_si256()); _mm256_存储_si256(重新解释铸造(a),t256); cout,c++,alignment,intel,C++,Alignment,Intel,\uuuuum256i需要与32字节(256位)边界对齐。由于数组a通过alignas(32)与32字节边界对齐,因此地址a和a+8(相当于(char*)a+8*sizeof(int32\u t))也与32字节边界对齐 但是,a+4不是。它的地址将在两个32字节边界之间。因此,您的第三个语句具有未定义的行为,并且可能在不同的体系结构上执行不同的操作。是否需要将\uuuum256i与32字节(256位)对齐边界?a+4不在32字节边界上。@kevin每个元素都是32位整数,因此a+1a+2a+3也

\uuuuum256i
需要与32字节(256位)边界对齐。由于数组
a
通过
alignas(32)
与32字节边界对齐,因此地址
a
a+8
(相当于
(char*)a+8*sizeof(int32\u t)
)也与32字节边界对齐


但是,
a+4
不是。它的地址将在两个32字节边界之间。因此,您的第三个语句具有未定义的行为,并且可能在不同的体系结构上执行不同的操作。

是否需要将
\uuuum256i
与32字节(256位)对齐边界?
a+4
不在32字节边界上。@kevin每个元素都是32位整数,因此
a+1
a+2
a+3
也应该在32字节边界上对齐,不是吗?不,
a+1
在32位(4字节)上边界。@Kevin我知道了,它是32-
字节
边界,而不是32-
边界。谢谢。你的意思是,在不同的编译器上。英特尔内部函数只能为x86编译。但是,是的,有些编译器使用
vmovdqu
(未对齐的存储),甚至当源代码使用
存储
而不是
存储
,更确切地说“原谅”。(或禁用您构建使用硬件对齐检查来检测潜在性能问题的版本的能力。)
#include<cstdint>
#include<iostream>
#include<immintrin.h>
using namespace std;

int main()
{
    alignas(32) int32_t a[32];
    __m256i t256(_mm256_setzero_si256());
    _mm256_store_si256(reinterpret_cast<__m256i*>(a),t256);
    cout<<"pass"<<endl;
    _mm256_store_si256(reinterpret_cast<__m256i*>(a+8),t256);
    cout<<"pass"<<endl;
    _mm256_store_si256(reinterpret_cast<__m256i*>(a+4),t256);
    cout<<"pass"<<endl;
}