我最近发现了关于vreinterpret{q}_dsttype_src类型转换运算符 https://stackoverflow.com/a/43519190/2436175。但是,这似乎不支持所描述的数据类型的转换这个链接 http://infocenter.arm.com/help/topic/com.arm.doc.dui0491f/BABFBJAA.html(页面底部):
一些内在函数使用以下形式的向量类型数组:
<type><size>x<number of lanes>x<length of array>_t
这些类型被视为包含单个
名为 val 的元素。
结构定义示例如下:
struct int16x4x2_t
{
int16x4_t val[2];
};
你知道如何从uint8x16_t
to uint8x8x2_t
?
请注意,该问题无法使用 union 可靠地解决 https://stackoverflow.com/a/29209307/2436175(从不活动的成员中读取会导致未定义的行为Edit:这只是 C++ 的情况,但事实证明C 允许类型双关 https://stackoverflow.com/a/11640603/2436175),也不由使用指针进行强制转换 https://stackoverflow.com/q/29253100/2436175(违反了严格的别名规则)。
It's 完全地在 C++ 中通过指针转换输入双关语是合法的,只要你这样做只是为了char*
。这并非巧合,这就是memcpy
被定义为致力于(技术上unsigned char*
这已经足够好了)。
请注意以下段落:
对于任何对象(基类子对象除外)
可复制类型 T,无论该对象是否持有类型的有效值
T,构成对象的底层字节(1.7)可以复制到
char 或 unsigned char 数组。
42 如果将 char 或 unsigned char 数组的内容复制回来
进入该物体,该物体随后应保持其原始状态
价值。 [例子:
#define N sizeof(T)
char buf[N];
T obj;
// obj initialized to its original value
std::memcpy(buf, &obj, N);
// between these two calls to std::memcpy,
// obj might be modified
std::memcpy(&obj, buf, N);
// at this point, each subobject of obj of scalar type
// holds its original value
—结束示例]
简单来说,像这样复制就是预期的功能std::memcpy
。只要您正在处理的类型满足必要的琐碎性要求,它就是完全合法的。
严格别名确实not包括char*
or unsigned char*
- 您可以随意为任何类型添加别名。
请注意,特别是对于无符号整数,您在这里有一些非常明确的回旋余地。 C++ 标准要求它们满足 C 标准的要求。 C 标准规定了该格式。捕获表示或类似内容的唯一方法是,您的实现是否有任何填充位,但 ARM 没有任何 8 位字节、8 位和 16 位整数。因此,对于具有零填充位的实现上的无符号整数,任何字节都是有效的无符号整数。
对于除 unsigned char 之外的无符号整数类型,这些位
对象表示的类型应分为两组:
值位和填充位(不需要任何
后者)。如果有N个值位,则每个位应代表
1 和 2N−1 之间的 2 的不同幂,因此对象
该类型应能够表示从 0 开始的值
使用纯二进制表示为 2N−1;这应是
称为值表示。任何填充位的值是
未指定。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)