ARM Neon:如何从 uint8x16_t 转换为 uint8x8x2_t?

2024-04-09

我最近发现了关于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(使用前将#替换为@)

ARM Neon:如何从 uint8x16_t 转换为 uint8x8x2_t? 的相关文章

  • 如何拦截 .Net 中第三方库对非虚拟方法的调用?

    我认为我需要的是 net 人们称之为 透明动态代理 的东西 但到目前为止我所看到的所有实现 Castle DynamicProxy Spring NET AOP 等 都要求我至少执行以下操作之一 将拦截的方法声明为虚拟方法 包装类并创建包装
  • 即使我没有#include ,为什么仍然可以使用 std::max 和 std::min ?

    include
  • 如何在联系我们页面中使用用户电子邮件发送电子邮件?

    我正在创建一个联系我们页面 并且我想从该页面接收邮件 因为它的邮件来自用户邮件 我写了这段代码 var client new SmtpClient smtp gmail com 587 Credentials new NetworkCred
  • 每个 CPU 核心处于 C0 电源状态的时间

    任何帮助弄清楚如何做到这一点都会很棒 在过去一秒内 每个 CPU 核心处于 C0 电源状态的时间有多少 这是针对 Mac 应用程序的 因此需要 Objective C cocoa 和 c OS X 没有任何公开 CPU c 状态的 API
  • 如何以编程方式确定 C 中 int 数据的最大和最小限制?

    我正在尝试 K R 的练习 2 1 练习内容如下 编写一个程序来确定范围char short int and long变量 两者signed and unsigned 通过从标准标题打印适当的值并通过直接计算 如果计算它们会更困难 确定各种
  • ApiController 操作无法从查询字符串解析数组

    使用 Visual Studio 2012 2 MVC4 Web 应用程序 我有请求发送到我的 ApiController 如下所示 http localhost api keys ids 1 ids 2 ids 3 我的印象是以下方法应该
  • 在 C++ 中,严格别名规则中的“访问”是什么意思?

    3 10 10 说 如果一个程序试图access通过除以下类型之一之外的泛左值存储对象的值 行为未定义 然而 术语 访问 并没有在任何地方定义 在这种情况下这意味着read or 读取或修改 在 C 标准中 它被明确定义为读取或修改 然而在
  • WIX 自动生成 GUID *?

    假设我生成产品 ID 为 的 WIX XML 文件 另外 对于每个组件 GUID 我都使用
  • C++ 克隆惯用语中协变返回类型的用处?

    通常的克隆习惯使用协变返回类型 struct Base virtual Base clone struct Derived public Base Derived clone 我读过一些内容 大意是协变返回类型是 C 后来添加的 较旧的编译
  • 平衡两轮机器人而不使其向前/向后漂移

    我正在尝试设计一个控制器来平衡 2 轮机器人 约 13 公斤 并使其能够抵抗外力 例如 如果有人踢它 它不应该掉落 也不应该无限期地向前 向后漂移 我对大多数控制技术 LQR 滑模控制 PID 等 都很有经验 但我在网上看到大多数人使用 L
  • 未定义条件编译符号

    我无法让 Visual Studio 按照我的预期运行 我创建了 2 个配置文件 一个定义了符号 FOO 另一个定义了符号 BAR 我有这个代码 static class MyClass if FOO public static strin
  • 让 WIX 在项目中包含引用

    我对 WiX 和设置自定义安装程序完全陌生 所以我对问题的主题表示歉意 我有一个内部业务应用程序 日记 它构建并运行良好 因此我按照教程 官方文档添加 WiX 项目并引用日记的 csproj 然后构建并运行这个最基本版本的 WiX 安装程序
  • Boost async_write问题

    我将展示一些代码 void wh const boost system error code ec std size t bytes transferred std cout lt lt test int main int argc cha
  • 如何在 Xamarin.Mac 中执行终端命令并读入其输出

    我们正在编写一个 Xamarin Mac 应用程序 我们需要执行像 uptime 这样的命令 并将其输出读取到应用程序中进行解析 这可以做到吗 在 Swift 和 Objective C 中都有 NTask 但我似乎无法在 C 中找到任何示
  • 我可以在C中直接比较int和size_t吗?

    我可以比较一个int and a size t像这样的变量 int i 1 size t y 2 if i y Do something 或者我必须输入其中之一 只要满足以下条件 它就是安全的int为零或正数 如果它是负数 并且size t
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们
  • 在同一条线上铸造两次

    我在项目中看到了这段代码 b的类型是void void b int a int unsigned long b 这条线毫无意义吗 我的意思是 这与a int b在所有情况下 这可能会避免 64 位 Unix 系统上的编译器警告unsigne
  • #define, #ifdef #undef #endif

    我有以下代码 define PROC ADD void main void while 1 ifdef PROC ADD Do this code here then undefined it to run the code in the
  • 如何从标准输入读取一行,阻塞直到找到换行符?

    我试图从命令行的标准输入一次读取任意长度的一行 我不确定是否能够包含 GNU readline 并且更喜欢使用库函数 我读过的文档表明getline应该可以工作 但在我的实验中它不会阻塞 我的示例程序 include
  • 在 C# 中将 ulong 映射到 long ?

    我正在尝试将 ulong 映射到 long 反之亦然 将 uint 映射到 int 反之亦然 如下所示 为了将值保存在具有签名类型的 MS SQL 数据库中仅限整数和大整数 我这样做是因为我必须检查 在数据库中 一个数字 uint ulon

随机推荐