近期对技术栈进行了一次跨界梳理,从底层的C++基础,到算法的优化思路,再到AIOT落地的现实考量,每一部分都带来了一些新的思考与收获。
C++ 知识点:从底层理解高效编程
本周重点复盘了一些关键的C++概念,旨在加深对底层机制的理解,从而写出更高效、更安全的代码。
1. vector 的原理与 resize 和 reserve 的区别
C++ 中的 vector 是动态数组的经典实现。其核心原理是在内存中维护一块连续的空间来存放元素。当现有空间不足以容纳新元素时,vector 会触发一次“扩容”操作:分配一块更大的内存,并将原有数据拷贝过去。
resize():用于调整 vector 的 size(元素数量)。若新大小大于当前大小,新增的元素会进行默认初始化。
reserve():用于预留内存空间,改变的是 capacity(容量),而不改变当前元素数量。其目的是减少因多次插入导致频繁内存分配的开销,适用于能预先估计容器最大规模的场景。
2. deque 的原理
deque(双端队列)的内部实现比 vector 更为复杂。它并非使用单一连续内存块,而是由多个分段的小内存块(缓冲区)组成。这种结构使得它能够在首尾两端进行高效的插入和删除操作,代价是随机访问的性能略低于 vector。
3. map 与 unordered_map 的区别
map:基于红黑树实现,因此元素是有序的(通常按key排序)。插入、删除、查找操作的时间复杂度为 O(log n)。
unordered_map:基于哈希表实现,查找、插入、删除的平均时间复杂度为 O(1),但元素的存储顺序是不确定的。
4. list 的使用场景
list 由双向链表实现。它最适用于需要频繁在任意位置进行插入和删除的场景,因为这些操作的时间复杂度是 O(1)。但其缺点是随机访问效率低,时间复杂度为 O(n)。
5. 什么是 C++ 中的 RAII?
RAII(资源获取即初始化)是 C++ 的核心资源管理范式。其思想是将资源的生命周期与对象的生命周期绑定:在对象构造函数中获取资源,在析构函数中释放资源。这种机制实现了资源管理的自动化,极大地减少了内存泄漏、文件未关闭等风险。智能指针(如 unique_ptr, shared_ptr)就是 RAII 思想的典型应用。
6. lock_guard 和 unique_lock 的区别
lock_guard:一种轻量、简单的互斥锁封装。它在构造时加锁,析构时自动解锁,适用于作用域内的简单锁定需求。
unique_lock:提供了更高的灵活性。除了自动管理,还支持手动lock()和unlock(),并可延迟加锁,适用于需要在不同代码段间精细控制锁状态的复杂场景。
7. thread 的 join 和 detach 的区别
join():阻塞当前线程,直至被 join 的目标线程执行完毕。
detach():将目标线程与当前线程分离,使其在后台独立运行(成为守护线程)。分离后,主线程不再能控制或等待该线程。
8. jthread 和 thread 的区别
jthread 是 C++20 引入的新线程类。其最大改进是自动管理线程生命周期。在 jthread 对象析构时,如果线程仍可联结(joinable),它会自动请求停止并执行 join(),彻底避免了因忘记调用 join 或 detach 而导致程序异常终止的问题,提升了代码的安全性。
9. memcpy 和 memmove 的区别
memcpy():用于快速的内存块复制。它要求源内存区和目标内存区不重叠,否则行为未定义。
memmove():专为处理内存区可能重叠的情况而设计。它在内部会先检查重叠区域,并采用安全的拷贝策略,确保结果正确。
算法思考:链表与哈希表
1. 链表操作模拟
在处理链表相关题目时,一个极为重要的技巧是:动手模拟。尤其是在进行指针修改、节点删除或链表反转时,在纸上或脑海中一步步画出指针的指向变化,能有效避免断链、形成环或内存泄漏等常见错误。模拟操作是检验逻辑严密性的好方法。
2. 哈希表与原地哈希
在哈希表的应用中,有一种节省空间的巧妙思路——原地哈希。其核心是将给定的数组本身作为哈希表来使用。例如,在一些寻找重复或缺失数字的问题中,我们可以通过修改数组元素的正负号或位置来标记信息,从而在 O(1) 的额外空间复杂度内解决问题。
网闸AI赋能:精简与可解释性
AIOT调研思考:网闸AI赋能
在为网闸这类边缘设备寻求 AIGC 赋能时,一个现实的挑战是:如何在不颠覆现有硬件架构的前提下,让性能受限的端侧设备也能进行有效的AI推理?
对此,我的思考聚焦于几个关键点:
- 模型极度精简:选择的模型必须足够轻量化,确保能在有限的计算和内存资源上流畅运行。这可能意味着需要牺牲一部分精度,或采用专门的模型压缩、量化技术。
- 强调可解释性:在工业或安全场景中,模型的决策过程需要清晰可循。因此,倾向于选择那些能提供明确推理依据的模型,增强系统透明度,便于调试和信任建立。
- AI结果作为参考:最终决策不应完全交由“黑盒”模型。AI的推理结果应作为一项高价值参考信息,输入到既定的规则引擎或由操作人员进行最终裁决。这样既利用了AI的智能,又通过规则兜底,确保了系统的可靠性与可控性。
这种在资源受限环境下进行智能处理的思路,本质上与传统嵌入式系统的优化哲学一脉相承——即在严苛的约束条件下,通过算法与工程的协同设计,挖掘极致的效率。
|