这是从 NEON uint8x16_t 向量中提取字节的正确方法吗?

Is this a proper way to extract a byte from a NEON uint8x16_t vector?

我是 NEON 内部函数的初学者,我想使用 uint8x16_tuint8x16x4_t。 在使用它时,我遇到了一种情况,我想从 uint8x16_t 中提取一个字节。由于不了解细节,我不小心开始在运行时使用 [] 运算符从中提取字节。但是我的编译器 CLANG 愉快地编译了代码,没有给出任何错误或警告,我得到了想要的输出。

我搜索了 ARM 参考指南,似乎从未找到任何关于在 uint8x16_t 向量上使用 [] 运算符的参考,毕竟它是一个 128 位寄存器而不是数组! ? (如果我错了,请纠正我)。

因此,为了解决这个问题,我在头文件 arm_neon.h 中跟踪了矢量 uint8x16_t 的来源,我发现了这个:

typedef __attribute__((neon_vector_type(16))) uint8_t uint8x16_t;

非常感谢您的帮助!

Why am I able to use the [] operator on it directly

因为 gcc / clang 根据 GNU C 本机向量 (https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html) 定义它,它确实有明确定义的运算符规则。

ARM 的文档可能不保证 [] 可以工作,并且可能有一些 ARM 编译器无法工作。


它与任何其他类型一样存储在内存中(或不存储,如果只是在寄存器中或优化掉)。对象表示在最低地址处具有最低元素。 uint8x16_t 对象在大多数方面都类似于 int 对象,编译器能够决定将它们保存在哪里,并将它们优化掉等等。