通过指针、强制转换和取消引用加载向量?

Posted

技术标签:

【中文标题】通过指针、强制转换和取消引用加载向量?【英文标题】:Loading vectors through pointers, casts and dereferences? 【发布时间】:2017-12-10 20:57:50 【问题描述】:

OpenPower Manual | Vector Data Types 声明避免手动加载元素并使用向量转换:

在应用程序定义的地址访问向量的首选方式 是通过使用向量指针和 C/C++ 取消引用运算符 *. 与其他 C /C++ 数据类型类似,数组引用运算符 [ ] 可用于使用带有矢量指针的矢量对象访问 从向量访问第 n 个向量元素的常用定义 指针。 vec_xl等vector内置函数的使用 不鼓励使用 vec_xst,但没有取消引用的语言除外 运算符可用。

vector char vca;
vector char vcb;
vector int via;
int a[4];
void *vp;

via = *(vector int *) &a[0];
vca = (vector char) via;
vcb = vca;
vca = *(vector char *)vp;
*(vector char *)&a[0] = vca;

我正处于测试该技术的早期阶段,但上面的代码似乎可以编译。测试的编译器是 GCC 4.0.1(旧 PowerMac G5)和 GCC 4.8.5(Power 730 服务器)。

我的第一个问题是,该技术是否正确处理未对齐的字节数组?

我的第二个问题是,该技术是否会在 little-endian 系统上自动执行 big-endian 转换?

我的第三个问题是,我们应该在实践中使用该技术吗?感觉该技术应该产生未定义的行为或双关语违规。

【问题讨论】:

【参考方案1】:

我的第一个问题是,该技术是否正确处理未对齐的字节数组?

不,它不能正确处理未对齐的数组。通过屏蔽掉 4 个低位,将内存地址和偏移量截断为有效地址。

我的第二个问题是,该技术是否会在 little-endian 系统上自动执行 big-endian 转换?

是的。

我的第三个问题是,我们应该在实践中使用该技术吗?

不,不要使用它。

【讨论】:

以上是关于通过指针、强制转换和取消引用加载向量?的主要内容,如果未能解决你的问题,请参考以下文章

int64_t 指针转换为 AVX2 内在 _m256i

向上强制转换和向下强制转换

用“void*”转换“char”指针并取消引用它

特定场景下指针解引用和强制转换之间的关系不清楚

关于继承中的强制类型转换

C++强制类型转换