- 博客(220)
- 资源 (10)
- 收藏
- 关注
原创 Flutter 使用 C、C++ 代码库,突破性能敏感和“底层”库移植能力
Flutter主要使用Dart语言,也就是说我们只要掌握了Dart语言调用C/C++的方法,就知道了如何在Flutter中调用C/C++编写的功能了。Dart的移动端、命令行和服务端应用所运行的Dart原生平台,均可以使用dart:ffi库调用原生的C语言API,用于读、写、分配和销毁原生内存。FFI(ForeignFunctionInterface)指的是外部函数接口。
2025-01-19 15:35:37
624
原创 libjpeg-turbo 加速 JPG 有损压缩与解压缩
libjpeg-turbo 是一个 JPEG 图像编解码器,它使用 SIMD 指令加速 x86、x86-64、Arm、PowerPC 和 MIPS 系统上的基本 JPEG 压缩和解压缩,以及 x86、x86-64 和 Arm 系统上的渐进式 JPEG 压缩。在这些系统上其他条件相同的情况下,libjpeg-turbo 通常比 libjpeg 快 2-6 倍。在其他类型的系统上,由于其高度优化的 Huffman 编码算法,libjpeg-turbo 仍能比 libjpeg 有显著的性能提升。
2024-12-05 08:33:44
1236
原创 Rust 程序设计语言学习——高级特性
RUST 中常用部分学习结束之后,我们来接触一些 RUST 中的其他高级用法。不安全 Rust:用于当需要舍弃 Rust 的某些保证并负责手动维持这些保证高级 trait:与 trait 相关的关联类型,默认类型参数,完全限定语法(fully qualified syntax),超(父)trait(supertraits)和 newtype 模式高级类型:关于 newtype 模式的更多内容,类型别名,never 类型和动态大小类型高级函数和闭包:函数指针和返回闭包宏:定义在编译时定义更多代码的
2024-10-29 08:01:36
1334
原创 Rust 程序设计语言学习——面向对象
面向对象编程(Object-Oriented Programming,OOP)是一种对程序进行建模方式。对象(Object)作为一个编程概念来源于 20 世纪 60 年代的 Simula 编程语言。这些对象影响了 Alan Kay 的编程架构,该架构中对象之间互相传递消息。他在 1967 年创造了面向对象编程 (object-oriented programming)这个术语。关于 OOP 是什么有很多相互矛盾的定义;在一些定义下,Rust 是面向对象的;在其他定义下,Rust 不是。
2024-09-10 07:41:41
1767
原创 Rust 程序设计语言学习——并发编程
安全且高效地处理并发编程是 Rust 的另一个主要目标。并发编程(Concurrent programming),代表程序的不同部分相互独立地执行,而并行编程(parallel programming)代表程序不同部分同时执行,这两个概念随着计算机越来越多的利用多处理器的优势而显得愈发重要。由于历史原因,在此类上下文中编程一直是困难且容易出错的:Rust 希望能改变这一点。起初,Rust 团队认为确保内存安全和防止并发问题是两个分别需要不同方法应对的挑战。
2024-08-04 14:03:08
1144
1
原创 Rust 程序设计语言学习——智能指针
智能指针(smart pointers)是一类数据结构,它们的表现类似指针,但是也拥有额外的元数据和功能。智能指针的概念并不为 Rust 所独有;其起源于 C++ 并存在于其他语言中。Rust 标准库中定义了多种不同的智能指针,它们提供了多于引用的额外功能。
2024-07-28 08:24:57
747
原创 Rust 程序设计语言学习——函数式语言功能:迭代器和闭包
Rust 的闭包(closures)是可以保存在一个变量中或作为参数传递给其他函数的匿名函数。可以在一个地方创建闭包,然后在不同的上下文中执行闭包运算。不同于函数,闭包允许捕获被定义时所在作用域中的值。迭代器(iterator)负责遍历序列中的每一项和决定序列何时结束的逻辑。当使用迭代器时,我们无需重新实现这些逻辑。
2024-07-07 14:12:11
1453
1
原创 Rust 程序设计语言学习——泛型、Trait和生命周期
每一种编程语言都有高效处理重复概念的工具。在 Rust 中其工具之一就是泛型。泛型是具体类型或其他属性的抽象替代。Trait 定义了某个特定类型拥有可能与其他类型共享的功能。可以通过 Trait 以一种抽象的方式定义共同行为。可以使用 trait bounds 指定泛型是任何拥有特定行为的类型。生命周期是另一类我们已经使用过的泛型。不同于确保类型有期望的行为,生命周期确保引用如预期一直有效。
2024-06-28 08:03:50
1094
1
原创 Rust 程序设计语言学习——常见集合:Vector String Map
Rust 中常见的集合包括 Vector(列表)、String(字符串)和 Map(键值对)。Vec,也被称为 vector。vector 允许我们在一个单独的数据结构中储存多于一个的值,它在内存中彼此相邻地排列所有的值。vector 只能储存相同类型的值。String字符串类型由 Rust 标准库提供,而不是编入核心语言,它是一种可增长、可变、可拥有和 UTF-8 编码的字符串类型。当 Rustaceans 提及 Rust 中的 "字符串 "时,他们可能指的是String。
2024-05-27 08:31:21
971
原创 Rust 程序设计语言学习——枚举&模式匹配
假设我们要跨省出行,有多种交通工具供选择。常用的交通工具有飞机、火车、汽车和轮船。这是我们常用的跨省出行乘坐交通工具的所有形式:所以可以枚举出所有可能的值,这也正是此枚举名字的由来。可以通过在代码中定义一个 Vehicle 枚举来表现这个概念并列出可能的交通工具类型,Airplane(飞机)、Train(火车)、Car(汽车) 和 Ship(轮船)。这被称为枚举的成员Airplane,Train,Car,Ship,如果现在我们要区分汽车到底是哪一种?
2024-04-05 20:10:31
1498
1
原创 Rust 程序设计语言学习——结构体
定义结构体,需要使用struct关键字并为整个结构体提供一个名字。结构体的名字需要描述它所组合的数据的意义。接着,在大括号中,定义每一部分数据的名字和类型,我们称为 字段(field)。
2024-03-24 07:41:29
1243
3
原创 Rust 程序设计语言学习——基础语法
println!( “Hello World”) 中的 println 后面还有一个!符号,println 不是一个函数,而是一个宏规则。println!()和print!()。这两个"函数"都是向命令行输出字符串的方法,区别仅在于前者会在输出的最后附加输出一个换行符。当用这两个"函数"输出信息的时候,第一个参数是格式字符串,后面是一串可变参数,对应着格式字符串中的"占位符",这一点与 C 语言中的printf函数很相似。但是,Rust 中格式字符串中的占位符不是 “% + 字母” 的形式,而是一对{}
2024-01-21 11:09:12
2495
1
原创 【ARMv8 SIMD和浮点指令编程】浮点数据转换指令——数据类型互转必备
浮点数据转换指令包括不同的浮点精度数之间的转换,还包括整型和浮点数之间的转化。在了解数据转换指令前,必须学习 IEEE 754 定义的五种舍入规则。
2023-12-09 07:33:58
1440
原创 【ARMv8 SIMD和浮点指令编程】浮点加减乘除指令——四则运算
浮点指令有专门的加减乘除四则运算指令,比如 FADD、FSUB、FMUL、FDIV 等。
2023-11-05 13:56:32
1066
原创 【ARMv8 SIMD和浮点指令编程】NEON 通用数据处理指令——复制、反转、提取、转置...
NEON 通用数据处理指令包括以下指令(不限于):• DUP将标量复制到向量的所有向量线。• EXT提取。反转向量中的元素。• TBL、TBX向量表查找。• TRN向量转置。• UZP、ZIP向量交叉存取和反向交叉存取。
2023-10-29 07:30:01
1347
原创 【ARMv8 SIMD和浮点指令编程】NEON 存储指令——如何将数据从寄存器存储到内存?
和加载指令一样,NEON 有一系列的存储指令。比如 ST1、ST2、ST3、ST4。
2023-10-28 14:54:47
1691
原创 【ARMv8 SIMD和浮点指令编程】NEON 加载指令——如何将数据从内存搬到寄存器(其它指令)?
除了基础的 LDx 指令,还有 LDP、LDR 这些指令,我们也需要关注。
2023-09-30 07:10:46
904
原创 【ARMv8 SIMD和浮点指令编程】NEON 加载指令——如何将数据从内存搬到寄存器(LDx&LDxR)?
将内存中的数据搬到 NEON 寄存器,有很多指令可以完成,熟悉这些指令是必须的。
2023-09-30 07:00:50
1076
原创 【ARMv8 SIMD和浮点指令编程】NEON 乘法指令——asimdrdm
ARMv8 有许多版本(ARMv8.1 等),它们定义了强制和可选功能。Linux 内核通过 hwcaps 公开了其中一些功能的存在。这些值显示在 /proc/cpuinfo 中。
2023-09-03 07:24:33
1268
原创 【ARMv8 SIMD和浮点指令编程】NEON 乘法指令——乘法知多少?
NEON 乘法指令包括向量乘法、向量乘加和向量乘减,还有和饱和相关的指令。总之,乘法指令是必修课,在我们的实际开发中会经常遇到。
2023-08-27 17:05:18
1220
原创 【ARMv8 SIMD和浮点指令编程】NEON 移位指令——左右移位之术
NEON 移位指令主要涉及逻辑移位、算术移位两大类,同时下面还介绍了两个移位插入指令。
2023-07-22 08:14:13
558
原创 【ARMv8 SIMD和浮点指令编程】NEON 比较指令——比较的方方面面
比较指令是常见的一类指令,NEON 中当然也排除,下面涉及比较和测试位两类指令。
2023-06-22 07:20:22
896
原创 【ARMv8 SIMD和浮点指令编程】NEON 移动指令——精通 MOV?
移动指令主要涉及 MOV 和 MVN,它们分别是移动和求反移动。如果你认为仅仅两条指令,还是太小看设计者了!
2023-06-18 07:22:32
1070
原创 【ARMv8 SIMD和浮点指令编程】NEON 逻辑指令——与或非有多少?
NEON 逻辑指令主要包括与、或、异或、位清除、或非、为 False 时按位插入、为 True 时按位插入和按位选择指令。
2023-06-10 07:43:37
1003
原创 【ARMv8 SIMD和浮点指令编程】NEON 通用算术指令——杂项也不少
无符号向量差值绝对值累加和差值绝对值。向量绝对值和求反。无符号向量最大值,无符号向量最小值,无符号向量按对最大值,无符号向量按对最小值,无符号跨向量最大值和跨向量最小值。向量前导符号位计数,前导零计数和设置位计数。
2023-06-10 07:28:02
805
原创 【ARMv8 SIMD和浮点指令编程】NEON 减法指令——减法也好几种
向量减法包括常见的普通加指令,还包括长减、宽减、半减、饱和减、按对减、按对加并累加、选择高半部分结果加、全部元素加等。
2023-06-04 06:43:12
479
原创 【ARMv8 SIMD和浮点指令编程】NEON 加法指令——加法都能玩出花
向量加法包括常见的普通加指令,还包括长加、宽加、半加、饱和加、按对加、按对加并累加、选择高半部分结果加、全部元素加等。如果你和我一开始以为的只有一种普通加,那就太小看设计者了!同时这么多加法指令的确会提升我们设计程序的效率,同样学习这些指令也需要花费不少精力。
2023-06-03 07:27:57
611
原创 【ARMv8 编程】A64 系统控制和其他指令
A64 指令集包含与以下相关的指令:异常处理、系统寄存器访问、调试、提示指令,在许多系统中都有电源管理应用程序。
2023-05-17 07:24:13
1509
原创 【ARMv8 编程】A64 流控制指令
A64 指令集提供了许多不同种类的分支指令。对于简单的相对分支,即那些从当前地址偏移的分支,使用 B 指令。无条件简单相对分支可以从当前程序计数器位置向后或向前分支最多 128MB。有条件的简单相对分支,其中条件代码附加到 B,具有 ±1MB 的较小范围。调用子程序时,需要将返回地址存储在链接寄存器(X30)中,使用 BL 指令。这没有条件版本。BL 的行为类似于 B 指令,具有将返回地址存储在寄存器 X30 中的附加作用,返回地址是 BL 之后指令的地址。
2023-05-17 07:18:33
956
原创 【ARMv8 编程】A64 内存访问其他指令
A64 内存访问其他指令包括浮点和 NEON 标量加载存储指令、访问多个内存位置指令、非特权访问指令、预取内存指令、非临时加载存储对指令、内存屏障和栅栏指令、同步原语等。
2023-05-13 11:02:28
1277
原创 【ARMv8 编程】A64 内存访问指令——内存存储指令
在内存加载一节中实际上已经使用了内存存储指令了,内存存储指令将寄存器的值存储到内存中。还有 unscaled-offset 偏移形式,例如STUR。程序员通常不需要明确使用 STUR 形式,因为大多数汇编器可以根据使用的偏移量选择合适的版本。要存储的大小可能小于寄存器。可以通过向 STR 添加 B 或 H 后缀来指定它。在这种情况下,存储的总是寄存器的最低有效部分。
2023-05-02 06:47:07
1723
原创 【ARMv8 编程】A64 内存访问指令——内存加载指令
与所有先前的 ARM 处理器一样,ARMv8 架构是一种加载/存储架构。这意味着没有数据处理指令直接对内存中的数据进行操作。数据必须首先被加载到寄存器中,修改,然后存储到内存中。该程序必须指定地址、要传输的数据大小以及源或目标寄存器。有额外的加载和存储指令提供更多选项,例如非临时加载/存储、加载/存储独占和获取/释放。对于加载到整数寄存器中的指令,可以选择要加载的大小。
2023-04-29 07:46:38
2258
原创 【ARMv8 编程】A64 数据处理指令——位域&字节操作指令
有些指令将字节、半字或字扩展到寄存器大小,可以是 X 或 W。这些指令存在于有符号(SXTB、SXTH、SXTW)和无符号(UXTB、UXTH)变体中,并且是适当的位域操作指令。这些指令的有符号和无符号变体都将字节、半字或字(尽管只有 SXTW 对字进行操作)扩展到寄存器大小。源始终是 W 寄存器。目标寄存器是 X 或 W 寄存器,但 SXTW 除外,它必须是 X 寄存器。—— 通过重复字节的最左边的位,将寄存器 W1 的最低有效字节从 8 位符号扩展为 64 位。
2023-04-15 13:46:48
3802
原创 【ARMv8 编程】A64 数据处理指令——移动&比较指令
移动指令主要为 MOV 以及它的各种“变体”,而比较指令主要用来进行比较并更新条件标志,用来实现条件判断等。
2023-04-08 07:20:49
3851
2
原创 【ARMv8 编程】A64 数据处理指令——逻辑&移位指令
逻辑指令包括与、或等指令,移位指令则分为逻辑移位和算术移位指令,下面则详细展开学习。
2023-04-02 15:36:23
2853
原创 【ARMv8 编程】A64 数据处理指令——算术指令
加减乘除类的指令统称为算术指令(ADD、SUB、ADC、SBC、NEG、MADD、MNEG、MSUB、MUL、SMADDL、SMNEGL、SMSUBL、SMULH、SMULL、UMADDL、UMNEGL、UMSUBL、UMULH、UMULL、SDIV、UDIV)
2023-03-26 08:21:25
2229
原创 【ARMv8 编程】ARMv8 指令集介绍
ARMv8 架构中引入的最重要的变化之一是增加了 64 位指令集。该指令集补充了现有的 32 位指令集架构。
2023-02-26 15:22:02
2757
原创 【ARMv8 SIMD和浮点指令编程】编程基础
ARM 高级 SIMD 架构、相关的实现和支持软件通常被称为 NEON 技术。AArch32(相当于 ARMv7 的 NEON 指令)和 AArch64 都有 NEON 指令集。两者都可以显著加速在大型数据集上的重复操作。这在媒体编解码器等应用中很有用。AArch64 的 NEON 架构使用 32 × 128 位寄存器,是 ARMv7 的两倍。这些寄存器与浮点指令使用的寄存器相同。
2023-02-14 08:05:12
1411
原创 FFmpeg 集成 x265 编译及解码
在编译 FFmpeg 之前需要先编译 x265,但并不是所有的版本都能直接使用,比如笔者同时编译 Android、Window 和 Linux 三个平台时,使用 Android NDK r21e 会遇到很多报错,符号缺失,无法编译 .S 文件都是可能遇到的问题。
2023-01-10 08:13:16
4903
Android发送邮件功能实现
2015-08-16
高仿今日头条字体渐变指示器
2015-04-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人