- 博客(190)
- 资源 (2)
- 收藏
- 关注
原创 防重入或并发调用(C++)
通常我们要防止同一方法在执行过程被「重入」(Re-entrance)或被并发调用,可以在方法入口做一个简单的“忙碌”检测,常见做法有两种:基于互斥锁(mutex)/尝试锁(try-lock),或基于原子标志(atomic flag)+ 小型 RAII 守卫。
2025-05-13 14:19:04
878
原创 QObject::connect()调用std::shared_ptr
在 Qt 的元对象系统里,QObject::connect() 需要拿到一个 QObject*(或者可调用对象),它并不会识别或解包 std::shared_ptr。所以直接把一个 std::shared_ptr 当作 slot 对象传进去,是编译不过去的。
2025-05-13 11:15:45
466
原创 std::iota(C++)
std::iota 定义在头文件 中,C++11 起引入。它用于向前迭代器区间依次填入连续递增的数值。常用于一次性将容器初始化为 0,1,2,… 或从任意起始值开始的连续整数序列。
2025-05-08 11:46:15
463
原创 压入从0到Nvector(C++)
核心思想:利用 C++20 的范围视图,生成一个惰性 iota 序列,再拷贝到 vector。核心思想:一次性分配好长度,再用 std::iota 填充从 0 开始的连续整数。核心思想:借助 STL 算法和迭代器适配器,一次性生成 N+1 个值。如果追求简洁与性能,推荐方法二:一次性分配 + std::iota。优势:最简洁、现代化,但需编译器支持 C++20。如果你只需要简单易懂的代码,方法一最合适。若项目已启用 C++20,可尝试方法四。优势:风格较函数式,避免显式循环。优势:代码简洁,效率高。
2025-05-08 11:40:00
306
原创 多返回值(C++)
思路:为这两个返回值命名一个上下文相关的结构体,返回时直接返回该结构体实例。// 定义一个结果结构体// 函数返回 DivResultstd::cout << "商 = " << result.quotient<< ", 余数 = " << result.remainder << "\n";优点语义清晰,成员有意义的名字。易于扩展:若将来需要附加更多信息,只要在结构体里加成员即可。缺点需要额外定义类型(但这种“显式”往往是优点)。方法语义清晰度扩展性性能典型用法。
2025-05-08 11:29:09
595
原创 std::all_of(C++)
std::all_of 是 C++11 引入的算法,用于判断给定范围内的所有元素是否都满足某个一元谓词(unary predicate)。如果范围为空,则返回 true。
2025-05-08 11:09:58
756
原创 右值引用与移动语义(C++)
/ s 是右值引用T&& 是一个右值引用类型,只能绑定到右值和左值引用 T& 相对int* data;public:// 构造函数// 移动构造函数// 清空旧资源// 移动赋值运算符if (this!特性左值引用 (T&右值引用 (T&&可绑定左值右值用途读取、修改现有值移动资源、优化性能需手动转换否需要与模板结合使用常见可用于完美转发性能提升:避免不必要的复制资源所有权转移:用于指针、文件、网络资源管理。
2025-05-07 12:06:20
367
原创 范围-based for 循环(C++)
范围-based for 循环(range-based for loop)是从 C++11 引入的语法糖,简化了对容器和数组的遍历,是对传统 for 循环的现代替代。
2025-05-07 11:58:35
329
原创 现代 C++ 特性(C++11/14/17/20)
特性类型C++11C++14C++17C++20类型推导autoLambda基础 lambda泛型 lambda捕获增强模板 lambda智能指针引入并发与异步thread协程模板编程右值引用折叠表达式Concepts文件与字符串span错误处理try-catch编译期计算constexpr更强更强几乎所有语法都支持。
2025-05-07 11:50:32
861
原创 性能优化-初识(C++)
内联是一种将函数调用展开为其函数体代码的优化方式,避免函数调用带来的栈帧开销和跳转成本。现代 CPU 使用多级缓存(L1/L2/L3)来缓解内存访问瓶颈。缓存命中率越高,程序运行越快。类型优化方式内存对齐、对象池、预分配并发读写锁、线程局部存储、减少锁粒度IO批量处理、异步IO、文件映射STL 容器vector替代list、使用编译优化-O3-flto架构与算法CRTP、循环展开、尾递归、跳表、B+树等测试与持续集成性能基准测试、perfgprofbenchmark工具。
2025-05-07 10:51:45
772
原创 内存池(C++)
C++ 标准库支持自定义分配器,利用内存池的技术,我们可以实现一个自定义分配器,用于与标准库容器结合。public:C++ 内存池是一种非常有效的内存管理技术,适用于高性能要求的应用程序,如游戏开发、嵌入式系统和高并发服务器。通过内存池,程序可以减少内存分配与释放的开销,控制内存的使用,避免碎片化,并提高系统的稳定性和效率。内存池的实现可以有多种方式,如简单的内存池、分类型内存池、自由链表和分配器模式等,开发者可以根据需求选择适合的实现方式。
2025-05-06 13:55:00
1034
原创 模板编程初映像(C++)
目的:通过参数化类型(或值),实现在编译期生成多种表现形式的代码,达到“编译期多态”(compile-time polymorphism)。优势:代码复用:一次编写,多处适用。类型安全:编译期检查,避免运行期错误。零开销抽象:编译器优化后与手写特化代码性能相当。
2025-05-06 13:49:24
587
原创 git flow
Git Flow 是 Vincent Driessen 在 2010 年提出的一套 Git 分支管理模型,它通过 主分支(master)、开发分支(develop) 以及若干辅助分支(feature、release、hotfix 等)来规范团队协作与发布流程。master:始终保持可部署状态,每次向 master 合并时都应该是一个新的生产版本。develop:日常开发集成分支,所有 feature 完成后都合并到 develop。
2025-05-06 12:03:31
1115
原创 内存管理(C++)
为什么要管理内存?C++ 是一门允许程序员直接控制内存分配与释放的语言。合理的内存管理可以:提高性能(减少系统调用、避免频繁分配/释放)降低内存占用(释放不再使用的对象)防止程序崩溃(访问无效内存)手动 vs 自动自动管理:局部变量、函数参数等,由编译器在作用域结束时自动释放。手动管理:通过 new/delete、malloc/free(C 风格)等方式,在堆上分配和释放内存,需要程序员自己管理。
2025-05-06 10:07:12
800
原创 学习路线(嵌入式软件)
参与开源嵌入式项目(如Zephyr、RT-Thread)外设工作原理(GPIO、UART、SPI、I2C等)参加嵌入式领域会议(Embedded World等)选择1-2个重点领域(如汽车、工业、消费电子)研究知名芯片参考设计(ST、NXP、TI等)《ARM Cortex-M权威指南》ARM Cortex-M/A系列。设计带OTA功能的智能传感器节点。《嵌入式系统软件设计中的模式》AUTOSAR CP/AP架构。面向对象在嵌入式中的应用。FreeRTOS任务管理。FreeRTOS官方文档。
2025-05-05 16:53:38
519
原创 学习路线(工业自动化软件架构)
IEC 61131-3标准语言(梯形图LD、功能块图FBD、结构化文本ST)工业以太网(PROFINET、EtherCAT、EtherNet/IP)各大自动化厂商技术文档(西门子、罗克韦尔、倍福等)NAMUR(国际过程工业自动化用户协会)技术报告。参加工业自动化顶级展会(汉诺威工业展、SPS等)研究行业参考架构(RAMI4.0、IIRA等)现场总线(PROFIBUS、Modbus)实现基于OPC UA的数据采集系统。工业互联网联盟(IIC)参考架构。C/C++(用于高性能应用)从传感器到云端全链路理解。
2025-05-05 16:42:35
1003
原创 学习路线(机器人软件架构)
研究知名机器人系统架构(如Boston Dynamics、KUKA、ABB等)ROS2设计文档(https://design.ros2.org)参加机器人系统架构相关会议(ROS World、ICRA等)ROS官方文档(http://wiki.ros.org)定期阅读机器人领域顶级会议论文(ICRA、IROS等)选择一个具体领域(如工业机器人、服务机器人等)学习相关领域知识(控制理论、AI、机械设计等)ROS基础(节点、话题、服务、参数)机器人系统组成(感知-决策-执行)简单机器人建模(URDF)
2025-05-05 16:32:14
1044
原创 学习路线(机器人系统)
硬件实践:从开发套件开始(如TurtleBot、UR机器人)安全认证(ISO 13849、IEC 61508)学习工业总线(PROFINET、EtherCAT)通信协议(ROS、CAN、EtherCAT)机器人操作系统源码(ROS2、MoveIt)视觉SLAM(ORB-SLAM、VINS)动力学仿真(Gazebo、MuJoCo)概率与统计(贝叶斯理论、卡尔曼滤波)实时系统(RTOS、Xenomai)三维几何(旋转矩阵、四元数、李群)线性代数(矩阵运算、特征值分解)传感器(IMU、激光雷达、相机)
2025-05-05 16:23:14
995
原创 学习路线(视觉)
CNN架构(LeNet、AlexNet、VGG、ResNet)学习工业通信协议(如PROFINET、EtherCAT)边缘设备部署(TensorRT、OpenVINO)行业标准(GigE Vision、GenICam)目标检测(YOLO、Faster R-CNN)语义分割(U-Net、Mask R-CNN)最新顶会论文(CVPR、ICCV、ECCV)基本特征提取(SIFT、SURF、ORB)OpenCV基础(图像读写、基本操作)图像处理基础(滤波、边缘检测、直方图)掌握工业相机特性(全局快门、触发模式)
2025-05-05 16:02:37
928
原创 学习路线(c++)
控制结构 (if/else, switch, for, while)异步操作 (std::async, std::future)容器 (vector, list, map, set等)算法 (sort, find, transform等)阅读优秀开源代码 (如Boost, LLVM)编译器源码 (GCC, Clang)线程 (std::thread)学习现代C++特性,避免过时实践。定期复习语言标准和核心概念。关注C++标准委员会动态。ISO C++标准文档。学习调试和性能分析工具。CppCon会议视频。
2025-05-05 15:54:16
680
原创 可变参数模板 和 折叠表达式 (C++)
C++17 的折叠表达式配合可变参数模板,让对任意数量参数进行聚合操作时,代码更加简洁、直观,完全摆脱了递归终止函数的模板噩梦。可以根据是否需要初始值,选择带或不带 init 的左折叠或右折叠形式;(... op pack) // 无初始值,左折叠(pack op ...) // 无初始值,右折叠(init op ... op pack) // 左折叠,带初始值(pack op ... op init) // 右折叠,带初始值。
2025-04-22 17:06:31
424
原创 [[maybe_unused]] (C++)
[maybe_unused]] 是 C++17 引入的 属性(attribute) 语法,用来告诉编译器“即使这个实体在代码中没被使用,也不要发出未使用警告”。
2025-04-22 15:22:04
271
原创 QHash(C++)
QHash 是 Qt 提供的基于哈希表的关联容器,用于将键(Key)映射到值(T)。它定义于头文件 中,模板形式为 QHash<Key, T>,其中 Key 必须满足可哈希的要求(要么是 Qt 内置可哈希类型,要么提供对应的 uint qHash(const Key &key, uint seed = 0) 重载),T 则为任意可复制的类型。在底层实现上,QHash 使用一组“桶”(bucket)来存放元素,每个桶维护一个链表(singly linked list)存储哈希冲突的节点。
2025-04-21 14:21:30
400
原创 std::set (C++)
template<class Key,// 降序// 插入后,将按从大到小顺序存储int age;if (a.age!// 年龄升序,若年龄相同则按名字升序。
2025-04-18 15:57:17
474
原创 switch–case的case作用域(C++)
若分支逻辑较复杂、需局部声明多种临时变量,或希望在分支末尾自动清理资源,推荐为每个 case 都包一对 {},这样结构更清晰、易于修改。加了 {} 时,每个 { …不加 {} 时,所有 case 标签下的代码都在同一个外层作用域里——它们“平铺”在 switch 的作用域内。加 {}:为该分支单独引入作用域,允许局部声明、RAII 管理资源、析构时机可控,增强代码安全性和可维护性。不加 {}:所有 case 分支共享同一作用域,不能在分支内部直接声明跨分支的局部变量。加了大括号(可以声明变量、管理资源)
2025-04-18 10:56:00
277
原创 std::unordered_map(C++)
定义:std::unordered_map<Key, T, Hash, KeyEqual, Allocator> 是一个基于哈希表(hash table)实现的键值对容器,提供平均 O(1) 的查找、插入和删除性能。特点:无序:元素按哈希值分布在若干“桶”(bucket)中,不保证遍历顺序。唯一键:同一个键最多只能出现一次;如果插入已存在的键,默认不覆盖(可用 operator[] 或 at 修改)。可自定义:支持自定义哈希函数和键相等比较器,也可指定内存分配器。
2025-04-17 16:16:33
928
原创 多任务响应1(Qt)
设计思想:解耦与扩展性: 每个功能都有独立的命令对象,新增或修改按键响应只需要新增或修改对应命令,而不必改动整体分发逻辑;统一管理: CommandManager 统一管理各个命令对象,与 UI 层解耦。利用 Qt 的信号和槽,UI 层只需负责转发按键事件;灵活性: 利用 C++17 的特性(如 lambda 表达式、std::unique_ptr 等),使代码更加现代化和健壮。[UI按钮]▼[Lambda表达式]│ 调用▼。
2025-04-14 09:57:14
481
原创 电影解说短视频创作流程指南
ChatGPT(免费版):输入指令如"推荐10部近期讨论度高的悬疑电影,附带剧情亮点分析"最低配置:Intel i5 + 16GB RAM(可运行轻量ML模型)"/“没想到接下来…4K素材:Pixabay/Storyblocks(免费额度)用so-vits-svc(开源)克隆特定音色(需自训练模型)Perplexity.ai(免费):实时获取电影热度数据。云端算力:Google Colab(免费GPU资源)Pictory.ai(免费试用):自动生成高光片段。EbSynth(开源):将关键帧转化为动画效果。
2025-04-03 09:13:47
1156
原创 界面架构 - MVVM (Qt)
在上述 MVVM 示例中:ViewModel 封装了业务逻辑(计算字符串长度),并通过 Q_PROPERTY 暴露输入文本(inputText)和计算结果(result)。当用户操作界面时,ViewModel 中的数据会更新,并通过信号通知 QML 自动刷新界面。View(QML 部分) 仅负责界面展示和用户交互,通过数据绑定与 ViewModel 建立联系。这样 View 完全不关心具体的业务逻辑,降低了耦合度。
2025-04-02 19:15:43
962
原创 界面架构 - 主流架构(Qt)
在 Qt 和 C++ 平台下,主流的界面和应用架构主要包括:MVC:Qt 内置的模型/视图框架即基于 MVC,适用于大多数标准桌面应用。MVP:通过引入 Presenter 层,进一步分离界面和业务逻辑,便于测试和维护。MVVM:特别适合基于 Qt Quick 和 QML 的项目,利用数据绑定实现高效的界面更新。选择哪种架构取决于项目规模、开发团队习惯以及对测试、维护和扩展性的要求。在简单项目中,直接使用 Qt 自带的 MVC 模型往往足够;
2025-04-02 16:17:43
963
原创 界面架构 - MVC和MVP异同
共同目标:都旨在分离数据、界面和业务逻辑,降低代码耦合,提高可测试性和可维护性。MVC 的特点:角色划分较为宽泛,View 可能具有一定的主动性;Controller 和 View 之间的交互方式较为灵活,但容易出现职责混淆的情况。MVP 的特点:View 尽可能被动,所有业务逻辑集中在 Presenter 中;数据流和控制更加明确,便于单元测试和维护,但相对实现复杂度较高。选择哪种架构要根据项目的复杂度、团队习惯以及对测试和扩展性的要求来决定。
2025-04-02 16:12:59
711
原创 界面架构- MVP(Qt)
在上述 MVP 示例中,我们将应用程序分为三个部分:Model 负责计算字符串的长度,不依赖于任何界面;View(MainWindow)构建用户界面,展示 QLineEdit、按钮和 QLabel,并实现 IView 接口,用于接收 Presenter 的更新通知;Presenter 接收 View 的操作请求,调用 Model 计算结果,再将结果传递回 View 更新界面。这种设计使得业务逻辑与界面展示彻底分离,便于单元测试 Presenter 以及在项目中对各模块进行独立开发和维护。
2025-04-02 16:01:41
1049
原创 Qt - findChild
findChild 是 Qt 中一个非常实用的工具函数,利用模板和元对象系统的强大特性,能够方便地在复杂的对象树中查找特定类型和名称的子对象。无论是在 UI 动态构建、调试还是模块化开发中,都能极大地提高开发效率,减少手动管理子对象的繁琐工作。
2025-04-01 15:26:04
705
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人