c ++将数据存储在对齐数组的中间

时间:2018-04-18 14:22:53

标签: c++ alignment intel

#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;
}

我在Windows中运行此程序时获得三次“通过”(由vs2017 15.6.6编译,CPU为i7-6700HQ)。
但是,我在arch linux中运行第三个语句时得到Segmentation fault(由g ++ 7.3.1&amp; clang 6.0.0编译,CPU为i7-7820x)。 我使用的选项是-std=c++17 -march=native

在我看来,我可以存储在a内的任何地方,因为a在32字节边界上对齐,并且每个元素都是32位整数。

但是我得到了什么Segmentation faultIntel _mm256_store_si256

1 个答案:

答案 0 :(得分:1)

__m256i需要与32字节(256位)边界对齐。由于数组a通过alignas(32)与32字节边界对齐,因此地址aa+8(等效地址(char*)a + 8*sizeof(int32_t))也与32对齐字节边界。

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