- 博客(119)
- 问答 (1)
- 收藏
- 关注
原创 CMake查找本地库的方法
CMake提供了多种查找依赖库的方法:标准find_package()适用于CMake兼容库;pkg_check_modules()通过pkg-config查找系统库;直接指定路径适合本地源码集成;自定义Find模块处理特殊需求;find_library()可精确控制库文件查找。选择方法需根据库类型(系统/CMake/本地)和项目需求(标准/特殊/精确控制)决定,注意设置REQUIRED确保必须找到依赖,并正确检查变量设置。
2025-12-15 10:37:05
210
原创 Linux 性能与内存分析工具
摘要: Linux开发中常用Valgrind和perf工具进行程序诊断。Valgrind专注内存正确性检测(泄漏/越界/未初始化变量),通过Memcheck等工具实现精确分析,但执行开销较大(10-30倍)。perf则用于性能优化,基于硬件计数器采样分析CPU热点、缓存命中率等,支持火焰图可视化,具有实时低开销特性。二者互补:Valgrind确保程序正确性,perf优化执行效率,通常在开发调试阶段联合使用。典型命令如valgrind --leak-check=full和perf record/report。
2025-11-04 18:11:30
321
原创 C++17 异构(tuple)与多模态数据结构(variant)
C++17提供了两种异构容器:std::variant是类型安全的联合体,一次只能存储一种类型,适合多模态数据;std::tuple可存储多个固定类型元素,适合函数多返回值等场景。variant运行时可切换类型,通过visit访问;tuple编译期确定结构,支持结构化绑定。前者适用于单值多态,后者用于固定组合数据。
2025-11-04 17:58:41
521
原创 笛卡尔坐标系转换(外参矩阵原理与用途)
外参矩阵用于描述两个笛卡尔坐标系间的几何关系,由旋转矩阵R和平移向量t组成,实现坐标系转换。其原理是通过旋转对齐坐标系方向,再通过平移调整原点位置。外参矩阵适用于任意笛卡尔坐标系(如相机、SLAM、LiDAR坐标系等),但不支持经纬度等球面坐标。主要应用于坐标系转换、相机标定、多传感器融合等领域。与内参矩阵不同,外参关注坐标系间的位置和姿态关系,而非相机内部参数。其本质是通过线性空间变换(旋转+平移)建立坐标系间的桥梁,是多传感器融合的核心工具。
2025-11-04 16:51:56
386
原创 Foxglove Studio 使用笔记(ROS2)
Foxglove Studio是一款跨平台的机器人数据可视化工具,支持Windows/macOS/Linux/Web系统,可连接ROS1/ROS2、WebSocket和自定义协议。它能实时显示传感器数据(图像、点云、激光雷达等)、TF变换和Marker信息。安装后,通过rosbridge_websocket或foxglove_bridge连接ROS2系统,在界面中添加各类数据面板(Image/3D/PointCloud等)即可实现多传感器数据叠加显示。使用时需确保每个传感器有独立topic和frame_id
2025-10-11 17:39:36
979
原创 ONNX(Open Neural Network Exchange)
ONNX(开放神经网络交换格式)是一种开源的机器学习模型表示标准,由微软和Meta联合发起,旨在实现不同框架间的模型互操作性。它通过标准化计算图、操作符集和元数据,支持PyTorch、TensorFlow等主流框架的模型转换,并能部署到云端、边缘设备和移动端。ONNX生态包含核心库、推理引擎(如ONNX Runtime)、转换工具、优化工具和可视化工具(如Netron)。其优势包括跨框架共享、简化部署、性能优化和丰富的硬件支持。典型工作流程包括模型训练、导出、验证、优化和推理,适用于模型共享、跨平台部署等场
2025-10-10 13:12:16
903
原创 深度学习框架
深度学习框架是构建、训练和部署模型的工具库,提供神经网络层、优化器和跨平台支持。主流框架包括: TensorFlow(Google):生态完善,适合工业部署,但学习曲线陡。 PyTorch(Meta):灵活易调试,适合研究,但部署较弱。 Keras:简化API,适合初学者快速开发。 Hugging Face:专注Transformer模型,NLP任务友好。 PaddlePaddle(百度):中文支持佳,适合本土应用。 选择建议: 新手选Keras/PyTorch 研究用PyTorch/JAX 生产部署选Te
2025-09-26 11:27:18
1232
原创 深度学习模型
介绍了深度学习的主要模型,包括卷积神经网络(CNN)、循环神经网络(RNN)、Transformer、自动编码器(AE)、生成对抗网络(GAN)、图神经网络(GNN)和扩散模型。笔记对比了各模型的原理、应用场景、优缺点,阐明其在图像、文本、图结构等任务中的适用性。
2025-09-26 11:16:48
1129
原创 C++ 装饰器模式
装饰器模式是一种结构型设计模式,允许动态扩展对象功能而不修改其代码。通过包装原始对象,遵循开放-封闭原则。C++11实现示例展示了咖啡订单系统,使用std::unique_ptr管理内存,通过MilkDecorator和SugarDecorator动态添加配料。该模式灵活易扩展,支持单一职责,但可能增加复杂性和性能开销。适用于日志系统、权限控制等需要动态功能扩展的场景。
2025-09-25 10:52:48
471
原创 C++11 值类别与完美转发
本文系统梳理了C++11中的核心概念:左值/右值、左值引用/右值引用和完美转发。左值表示持久对象,右值表示临时数据;右值引用通过移动语义优化性能。完美转发利用T&&和std::forward保留参数原始类型,实现无损参数传递,在模板编程中尤为重要。典型应用包括移动构造函数、工厂函数等场景,能显著提升效率。使用时需注意转发引用的模板限定性、右值引用变量的左值属性等关键细节。这些特性共同构成了现代C++高效资源管理的基础机制。
2025-09-17 10:40:23
819
原创 C++11 完美转发
C++11的完美转发机制通过转发引用(T&&)和std::forward实现,解决了模板函数中参数值类别丢失的问题。转发引用根据传入参数推导为左值或右值引用,而std::forward则保持参数的原始值类别进行传递。这一特性广泛应用于构造函数模板、函数包装器和工厂模式中,可避免不必要的拷贝,提升性能。使用时需注意转发引用仅在模板中有效,并避免滥用。完美转发是现代C++模板编程的重要工具,尤其适用于需要无损传递参数的场景。
2025-09-17 10:18:55
751
原创 C++ 多态
C++多态摘要 C++多态分为编译时多态(函数重载、模板)和运行时多态(虚函数)。运行时多态通过虚函数表和虚表指针实现动态绑定,允许基类指针调用派生类函数。虚函数表存储虚函数地址,对象通过虚表指针访问对应函数。关键点包括:虚函数有空间/时间开销,纯虚函数定义抽象类,析构函数应声明为虚函数。编译时多态则通过函数重载和模板在编译期确定调用。多态提供了面向对象编程的灵活扩展能力。
2025-09-17 10:00:26
500
原创 MinIO 分布式模式与纠删码
MinIO 支持 分布式模式(Distributed Mode),在多节点部署时默认启用 纠删码(Erasure Coding, EC),提高数据可靠性与容错能力。
2025-09-12 10:21:12
536
原创 MinIO三种模式
MinIO 提供三种运行模式:Standalone(单机模式,适合开发测试)、Distributed(分布式集群,支持高可用和大容量)和 Gateway(网关模式,将现有存储系统转为S3接口)。独立模式性能最佳但无冗余,分布式模式适合企业生产环境,网关模式则用于快速集成已有存储。根据数据规模、性能需求和可用性要求选择不同部署方案。
2025-09-12 09:55:02
958
原创 Ubuntu 22.04 安装 ROS 2 Humble 笔记
本文详细介绍了在Ubuntu系统上安装ROS 2 Humble的完整步骤。主要内容包括:1)系统更新与工具安装;2)添加官方或国内镜像源;3)安装桌面版或基础版;4)环境变量配置;5)测试安装;6)常见问题解决方案;7)目录结构说明;8)Humble版本特性介绍。该版本为LTS长期支持版,支持至2027年,适合Ubuntu 22.04系统,推荐使用清华等国内源加速下载。安装完成后可通过运行demo节点测试验证。
2025-09-10 21:31:19
615
原创 H264: SPS和PPS概念
摘要:SPS和PPS是H.264编码的核心参数集,分别定义视频序列全局参数和单帧解码参数。SPS包含分辨率、帧率等固定信息,PPS包含熵编码类型等可变参数。在MP4格式中,它们集中存储在extradata字段,管理方便但容错性差;TS格式则分散在每个关键帧前,冗余但容错性强。格式转换时需提取SPS/PPS,并将AVCC转为Annex-B格式。常见问题包括参数缺失导致的解码失败,最佳实践是确保参数完整并在关键帧前检查插入。合理处理SPS/PPS对视频解码可靠性和效率至关重要。
2025-08-18 16:20:27
577
原创 H.264编码格式详解:Annex-B vs AVCC
H.264视频编码标准在TS和MP4容器中采用两种封装格式:Annex-B(起始码标识)和AVCC(长度前缀)。Annex-B兼容性好,适合流媒体传输;AVCC支持随机访问,适合本地存储。RTSP传输必须使用Annex-B格式。实际应用中,MP4文件需转换为Annex-B格式才能用于RTSP流媒体传输。两种格式各有优势,选择取决于具体应用场景,如流媒体优先选择Annex-B,本地存储则更适合AVCC。
2025-08-14 17:35:13
857
原创 Protobuf动态解析
Protobuf动态解析是一种在运行时根据描述文件解析 protobuf 消息的技术,无需在编译时绑定具体的消息类型。这种技术广泛应用于消息中间件、数据序列化、API 网关等场景。
2025-07-31 20:33:48
1097
原创 Linux CPU 亲和性
CPU亲和性是将线程绑定到特定CPU核心的技术,用于优化性能、降低延迟和减少缓存失效。在Linux中可通过sched_setaffinity等API设置线程的CPU掩码,并常与实时调度策略(如SCHED_FIFO)结合使用。核心操作包括设置/获取亲和性掩码(cpu_set_t)以及相关宏操作(如CPU_SET)。使用时需注意权限限制、多核利用率及实时调度可能导致的线程饿死问题。CPU亲和性可显著提升缓存效率和任务确定性,但不当配置可能导致负载不均,需权衡使用场景。工具taskset可用于查看和调整线程的CP
2025-06-11 17:51:46
592
原创 Linux 任务调度策略
Linux内核提供了三种主要调度策略:SCHED_FIFO(先进先出实时调度)、SCHED_RR(轮转实时调度)和SCHED_OTHER(基于CFS的非实时调度)。SCHED_FIFO适用于硬实时任务,无时间片限制;SCHED_RR采用时间片轮转,兼顾实时性和公平性;SCHED_OTHER通过vruntime机制实现公平调度。实时调度策略需要root权限,优先级1-99,而非实时策略使用nice值调整优先级。选择策略需权衡实时性、公平性和风险,如SCHED_FIFO可能导致低优先级任务饿死,而SCHED_O
2025-06-11 17:46:15
1217
原创 C++ call_once用法
📌 摘要 std::call_once 是 C++11 提供的线程安全单次调用工具,用于确保函数在多线程环境中仅执行一次,适用于单例模式、延迟初始化等场景。 🔹 核心机制 配合 std::once_flag 标志位跟踪执行状态。 首次调用时执行目标函数,后续调用自动跳过。 若函数抛出异常,允许其他线程重试。 ⚡ 优势 无需手动加锁,内置线程安全。 支持异常处理与延迟初始化。 ⚠️ 注意 once_flag 不可复制/移动,需全局或静态管理。 初始化函数应避免长时间阻塞。 📝 示例 // 线程安全单例
2025-06-11 17:25:53
536
原创 进程间通信(IPC): POSIX 消息队列
POSIX 消息队列是进程间通信(IPC)的一种机制,允许进程通过内核管理的队列发送和接收离散消息,适合本地异步通信。消息队列由用户定义的名称(如 `/myqueue`)标识,内核维护消息的存储和传递。
2025-05-20 11:20:06
987
原创 进程间通信(IPC):LocalSocket
LocalSocket 是基于 Unix 域套接字(Unix Domain Socket)的 IPC 机制,用于同一设备上的进程间通信。它通过内核直接传递数据,绕过网络协议栈,具有高效率和低延迟的特点,广泛应用于 Android 系统(如与 Zygote 通信)或本地服务通信。
2025-05-20 09:23:44
1423
3
原创 进程间通信(IPC)常用方式对比
进程间通信(IPC)是操作系统中不同进程之间交换数据的机制,广泛用于多进程应用(如客户端-服务器模型、系统服务通信)。以下对比五种常见 IPC 方式:LocalSocket(Unix 域套接字)、管道、消息队列、共享内存和信号。
2025-05-20 09:17:25
1291
原创 C++ I/O多路复用
I/O多路复用是一种允许程序同时监视多个文件描述符(如套接字、文件等)的技术,检查它们是否准备好进行读、写或异常操作,而无需为每个描述符创建单独的线程或进程。这种技术在网络编程和高并发应用中至关重要,主要优点包括高效性、资源节约、可扩展性和简化设计。常见的I/O多路复用机制包括select、poll、epoll(Linux特有)和kqueue(BSD/macOS特有)。select和poll适合跨平台和小规模场景,而epoll和kqueue则在高并发环境下表现优异。选择合适的多路复用机制应根据项目需求和平台
2025-05-16 16:45:44
911
原创 C++ 双缓冲区生产者-消费者
双缓冲区(Double Buffering)是一种用于优化多线程或并发环境中数据生产和消费性能的技术。它通过使用两个缓冲区(前缓冲区和后缓冲区)来减少线程间的竞争和锁的使用,从而提高吞吐量。核心思想是生产者向写缓冲区写入数据,消费者从读缓冲区读取数据,当写缓冲区满或读缓冲区空时,交换两个缓冲区。双缓冲区的优点包括减少锁竞争、提高效率和适用于实时数据处理等场景,但也存在内存使用增加和实现复杂度较高的缺点。在C++中,双缓冲区可以通过互斥锁和条件变量实现线程安全,并通过交换缓冲区来协调生产者和消费者的操作。双缓
2025-05-16 15:06:01
1112
原创 C++ 条件变量与线程通知机制:std::condition_variable
std::condition_variable 是 C++11 引入的线程间通信机制,通常与 std::mutex 配合使用,适用于生产者-消费者模型等场景。其核心原理是通过 wait() 使线程进入阻塞状态,直到其他线程调用 notify_one() 或 notify_all() 唤醒它。wait() 会自动释放并重新获取锁。需要注意的是,wait() 可能发生虚假唤醒,即线程在没有收到通知时被唤醒,因此推荐使用带谓词版本的 wait(lock, predicate),确保线程仅在条件满足时继续执行。示例
2025-05-16 14:51:44
707
原创 C++ 中的几种锁机制整理
本文介绍了四种常见的线程同步工具:互斥锁、自旋锁、读写锁和原子锁。互斥锁(std::mutex)是最常用的同步工具,简单易用,但锁竞争时线程会挂起,涉及上下文切换。自旋锁通过忙等待方式避免线程切换,适合临界区执行时间极短的场景,但会占用CPU资源。读写锁(std::shared_mutex)允许多个线程并发读,写操作独占,适合读多写少的场景。原子锁(基于std::atomic)利用原子变量实现无锁同步,性能极高,但仅适用于简单场景。总结对比了四种锁的阻塞性、性能、适用场景及标准库支持情况,帮助开发者根据具体
2025-05-16 14:24:35
558
原创 Linux动态库热加载:动态库与主程序符号调用机制总结
动态库与主程序之间的符号调用关系复杂,需注意符号可见性和ABI兼容性。动态库可调用主程序的符号,因为主程序的全局符号默认暴露在符号表中,且两者共享同一地址空间。然而,主程序不能直接调用动态库的符号,除非动态库显式导出符号。实践中,建议采用插件模式设计,让动态库通过主程序导出的接口注册自身,并使用 dlsym 动态查找动态库的符号。此外,确保主程序和动态库的ABI兼容性,并使用 extern "C" 避免C++名字修饰问题,以保证符号查找成功。
2025-05-15 16:37:35
244
原创 Linux动态库热加载驱动插件机制-示例
本文介绍了一种插件式驱动系统的设计与实现,旨在通过动态加载外部 .so 驱动,使主程序能够灵活调用不同功能。系统核心基于工厂模式,利用 dlopen() 加载插件,并通过静态对象构造自动注册驱动到单例工厂。插件结构包括驱动接口基类、工厂注册类模板和插件注册辅助模板,支持 C++ 标准类型和继承体系。主程序通过工厂单例获取驱动实例并调用接口,无需手动注册或暴露 C 符号。该设计简洁高效,符合现代 C++ 插件开发理念,适用于需要动态扩展功能的场景。
2025-05-15 16:26:33
420
原创 Linux 动态库热加载
热加载(Hot Reload)是一种在不重启主程序的情况下,通过动态加载或重新加载动态库(.so 文件)来更新或替换逻辑的技术。其核心流程包括使用 dlopen 加载库、dlsym 获取函数地址、dlclose 卸载库等系统函数。为了确保 dlsym 能正确识别函数名,建议使用 extern "C" 避免 C++ 的名称修饰。动态库函数的参数设计应尽量使用简单类型(如 int、const char*、void*),避免使用 C++ 标准库类型(如 std::string、std::vec
2025-05-15 14:20:56
352
原创 SFTP 使用方法
SFTP(SSH File Transfer Protocol)是一种安全的文件传输协议,通过 SSH(Secure Shell)提供加密的文件传输服务。SFTP 比传统的 FTP 更安全,因为它使用加密来保护传输的数据。
2025-01-26 14:11:10
2337
原创 C++ 中的最大值和最小值判断
是 C++ 标准库中的模板类,用于获取各种数据类型的最大值和最小值。它提供了一种通用的方式,适用于所有标准数据类型(如intlongfloatdouble等)。
2025-01-21 21:38:19
575
原创 docker load 后镜像名称为空的问题解决
加载 Docker 镜像后,镜像有时会显示名称为空。这通常是因为在打包镜像时使用了镜像 ID,而不是镜像名称。),解压后镜像可能没有名称,导致在加载时无法显示镜像名称。为避免镜像名称丢失,推荐在打包镜像时使用镜像的名称和标签。:在打包镜像时,如果使用镜像 ID 进行打包(例如。如果已经加载了镜像但没有名称,可以通过。为镜像添加名称和标签。
2024-08-09 14:33:46
2742
原创 netstat的使用方法
netstat 是一个在 Linux 系统中用来打印网络连接、路由表、接口统计等信息的工具。它可以帮助排查端口占用问题、监控网络连接状态以及识别使用特定端口的进程等。
2024-07-29 10:59:16
724
原创 查找子串方法总结
是 C++ 标准库中的一个算法,属于泛型编程的范畴。它能够在容器的任意范围内查找子序列。泛型编程的核心思想是编写代码,使其能够处理不同类型的容器和迭代器,而不依赖于具体的容器实现。是由标准库实现的,经过了优化,性能较好。实测效率高,推荐使用。
2024-07-15 18:04:43
1365
原创 C++ 锁管理:std::lock_guard 和 std::unique_lock 使用方法
适用于简单的自动化锁定和解锁场景,功能有限但性能开销小。:适用于需要更复杂控制的场景,例如手动解锁、重新加锁及与条件变量配合使用,提供了更多的灵活性,但性能开销较大。
2024-07-05 17:09:46
1449
空空如也
C++智能指针问题,求大家解惑
2021-08-30
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅