精选分类

文章列表

2.5k2 分钟

# Conan+CMake基本编译流程 # 本地编译 # 1. Conan 安装依赖 首先,使用 Conan 安装项目所需的第三方包。Conan 会根据构建类型(Debug/Release)将生成的文件放置在不同的目录中。 默认情况下,Conan 会创建 build/Release/generators 目录来存放生成文件。 conan install . --build=missing 可以明确指定构建类型,例如 Debug。 conan install . --build=missing -s build_type=Deb
3.6k3 分钟

# Rust 错误处理机制 # 一、 错误分类:可恢复与不可恢复 在 Rust 中,错误被分为两大类:不可恢复的错误和可恢复的错误。系统为这两种错误提供了不同的处理机制。 特性 panic! (不可恢复错误) Result<T, E> (可恢复错误) 核心用途 处理程序缺陷(Bug),表示程序进入了无法安全继续执行的状态。 处理可预期的、能够被合理响应的运行时错误。 典型场景 访问数组越界、断言失败等。 文件未找到、网络连接中断、输入解析失败等。 程序行为 立即终止当前线程,展开调用栈并清理数据。 返回一个包含成功值或错误值的枚举,由调用者决定如何处理。
2.4k2 分钟

# 指定返回类型:impl Trait 语法 # 核心问题 当函数返回一个复杂但实现了某个 trait 的类型时,如何简化函数签名,同时又不丢失必要的类型信息? 这在以下两种情况中尤为突出: 返回类型极其复杂:函数的返回值是一个由泛型和闭包等组合而成的具体类型,其名称可能非常长,甚至在语法上无法直接写出。这在 Rust 的迭代器适配器链中尤为常见。 例如,对于下面的函数,其返回值的具体类型是什么? fn get_even_plus_one(numbers: Vec<u32>) -> ??? { numbers.into_iter()
4.8k4 分钟

# Trait 与泛型约束:Trait Bounds Trait 约束(Trait Bounds)是 Rust 泛型系统中的核心特性,它允许我们对泛型参数可以使用的类型进行限制。其功能和设计哲学与 C++20 中引入的 Concepts 非常相似,主要解决了传统 C++ 模板(Templates)因“鸭子类型”而导致的编译错误信息晦涩难懂的问题。 # 一、C++ 模板的历史问题:鸭子类型 在 C++20 引入 Concepts 之前,C++ 模板遵循“鸭子类型”原则:“如果一个东西走起来像鸭子,叫起来也像鸭子,那它就是一只鸭子”。编译器不会在定义模板时检查类型的合法性,而是在模板被具体类型实例
6.9k6 分钟

# 一、Trait 的本质:定义共享行为 核心类比 (C++): trait ≈ 抽象基类 (Abstract Base Class) / 纯虚接口 (Interface)。 关键区别: Rust 的 trait 是编译期抽象,且更侧重于行为的“组合”而非类型的“继承”。 要点: 如何定义一个 trait? 如何为一个类型实现 (impl) trait? 提供默认实现 (Default Implementation) -> 对比 C++ 抽象基类中的虚函数实现。 # 1. C++ 中的类比:抽象基类 在传统的面向对象语言如 C++ 中,实现共享行为通常通过定义一个抽象
3.1k3 分钟

# 一、缓存失效的背后:三大核心机制 为何CPU高速缓存中的数据会“失效”,其背后的主要机制有哪些? CPU高速缓存是提升性能的关键,但它并非一个静态的存储区域。缓存中的数据会因为容量限制、多核间的数据同步以及与外部设备交互等多种原因被替换或宣告无效,理解这些机制是优化性能的基础。 CPU缓存中的数据“失效”,通常指数据被替换或被标记为无效,使其无法再被CPU使用。这一过程主要由以下三种机制驱动: 容量竞争与替换:CPU缓存的容量非常有限。当缓存已满时,若要载入新的数据,就必须按照某种替换算法(如 LRU - 最近最少使用算法)丢弃一些现有的数据。这是最常见和基本的“失效”形式,由缓存自
3.3k3 分钟

# 一、统一的调度单元:任务(Task) Linux调度器进行上下文切换的基本单位究竟是什么,它又是如何统一进程与线程这两个概念的呢? 操作系统中同时存在进程和线程,它们都需要CPU资源且都会发生上下文切换。为了高效管理,调度器并非在两种不同类型的实体间做选择,而是将它们抽象成一个统一的调度单元。 在Linux内核的视角中,进行调度和上下文切换的基本单位是任务(task),它由一个名为 task_struct 的数据结构来描述。这种设计巧妙地统一了进程和线程的概念。 具体来说,一个进程被视为一个资源的集合(如虚拟内存空间、文件描述符等),以及至少一个执行流。当一个进程被创建时,内核会创建一
5.8k5 分钟

# USB摄像头(带麦克风和扬声器)调试 带麦克风咪头和扬声器的USB摄像头 # 摄像头探测 首先,需要确认摄像头设备是否被系统正确识别。 列出USB设备 使用lsusb命令可以查看所有连接到系统的USB设备。 hao@lckfb-taishanpi:~$ lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 003 Device 001: ID 1d6b:0002 Lin
2.1k2 分钟

# 使用 Docker 安装并运行 Vivado 开发套件 本文档旨在记录如何通过 Docker 来安装和运行 Xilinx Vivado 开发套件,以实现开发环境的隔离与快速部署。 # 1. 修复语言环境问题的 Dockerfile 基础镜像 gusanagy/xilinx-vivado:2024.1-x11 存在语言环境(locale)配置问题,可能导致部分 GUI 工具无法正常启动。通过以下 Dockerfile 可以修复此问题。 FROM gusanagy/xilinx-vivado:2024.1-x11 # 切换到 root 用户以获得安装权限 USER roo
2k2 分钟

# Rust 中的枚举 (Enum) 枚举(Enumeration)是一种允许我们列举所有可能的值来定义一个类型的方式。 # 定义枚举 我们可以使用 enum 关键字来定义一个枚举类型,它的每个成员(变体)都可以代表一种可能的值。 enum IpAddrKind { V4, V6, } # 将数据附加到枚举变体 Rust 的枚举一个强大的功能是,每个变体都可以关联不同类型和数量的数据。 enum IpAddrKind { V4(String), V6(String), } let home = IpAddrKi