gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:02:23 27 4
gpt4 key购买 nike

#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中运行这个程序时得到三个“pass”(用vs2017 15.6.6编译,CPU是i7-6700HQ)。
但是,在 arch linux 中运行第三条语句时出现Segmentation fault(由 g++ 7.3.1 和 clang 6.0.0 编译,CPU 为 i7-7820x)。
我使用的选项是 -std=c++17 -march=native

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

但是我得到了什么Segmentation fault
Intel _mm256_store_si256

最佳答案

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

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

关于c++将数据存储在对齐数组的中间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49902217/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com