1.STL容器—list使用技巧
2.双向循环链表:鸿蒙轻内核中数据的链接“驿站”
3.在C++程序中嵌入quickjs实现C++和javascript互相调用
STL容器—list使用技巧
列表容器(list)在STL中是一种序列容器,特点是源码非连续内存分配。对比vector,链接其查找操作通常较慢,源码但插入和删除操作速度较快。链接列表通常实现为双向链表,源码徐源码这为实现单链表提供了便利。链接通过双向链接,源码可在常数时间内进行插入和删除操作,链接但查找操作需遍历整个列表,源码时间复杂度为O(n)。链接
查看上图,源码可了解std::list在内存中的链接布局,列表中的源码房源码撤销元素通过双向链接结点存储,每个结点包含数据和指向前后结点的链接指针。
列表的查找操作耗时,一旦找到元素,后续操作如更新、插入或删除则为常数时间复杂度。从性能角度看,list并不总是最佳选择,但在某些场景下仍具有优势。
以下代码展示了如何使用list进行内存分配测试,结果显示list的内存分配与vector不同,不会在插入元素时进行内存重新分配和数据拷贝。
清理list内存通常较为复杂。std::list自身并未提供内存释放接口,秦唐源码且标准库不保证立即释放内存。只有vector和string容器支持类似std::vector的swap函数,以在清理内存时立即释放空间。例如,chromium.org源代码中的stl_util.h文件中的清理代码仅适用于vector和string。
尽管在多数情况下std::list似乎并不突出,它在某些特定场景中仍具有用武之地。例如,当需要频繁插入和删除元素,而访问元素的顺序不固定时,list可能是更优选择。此外,当处理大量数据且内存使用效率是商品漱源码关键因素时,list的特性也能带来优势。因此,在权衡效率和特定需求后,list仍值得在编程实践中考虑。
双向循环链表:鸿蒙轻内核中数据的“驿站”
摘要:双向循环链表Doubly Linked List在鸿蒙轻内核中扮演重要角色,广泛应用于各个模块。本文旨在深入解析双向循环链表在源代码中的应用,帮助读者理解和学习其在鸿蒙轻内核中的使用方法。以OpenHarmony LiteOS-M内核为例,通过详细讲解数据结构、初始化、判断、插入、宝塔源码备份删除、获取及遍历操作,本文将提供全面的双向循环链表操作指南。本文内容基于开源站点gitee.com/openharmony/k...
1 双向循环链表
双向循环链表的结构体LOS_DL_LIST在utils/los_list.h头文件中定义。它包含前驱和后继两个节点指针,用于实现环状数据结构。双向链表不存储业务数据,通常与业务数据结构结合使用。
双向链表的节点间操作方便,便于查找、插入和删除。通过定义一个LOS_DL_LIST类型的头结点,业务结构体的链表成员依次挂载,从而实现遍历。例如,互斥锁结构体LosMuxCB中,双向链表LOS_DL_LIST muxList与互斥锁业务信息成员协同工作。
初始化双向链表,可使用LOS_ListInit()函数为链表节点申请内存并链接环状。通过LOS_DL_LIST_HEAD()宏定义也可以直接初始化链表。
判断链表是否为空,使用LOS_ListEmpty()函数检查前驱和后继节点是否均为自身。
插入双向链表节点,提供三种方法:在指定节点后、尾部或头部插入。使用LOS_ListAdd()、LOS_ListTailInsert()和LOS_ListHeadInsert()内联函数分别实现。
删除双向链表节点,可使用LOS_ListDelete()函数移除指定节点,或使用LOS_ListDelInit()重置节点为新链表。
获取双向链表节点,可通过LOS_DL_LIST_LAST()和LOS_DL_LIST_FIRST()获取前驱和后继节点。
遍历双向循环链表节点,使用LOS_DL_LIST_FOR_EACH()、LOS_DL_LIST_FOR_EACH_SAFE()和LOS_DL_LIST_FOR_EACH_ENTRY()等宏定义,实现节点的遍历。
获取链表节点所在结构体,利用LOS_OFF_SET_OF()和LOS_DL_LIST_ENTRY()宏定义,计算结构体内存地址。
基于以上操作,双向循环链表在鸿蒙轻内核中提供了高效、灵活的数据结构支持,是实现模块间高效数据传递和管理的关键。
在C++程序中嵌入quickjs实现C++和javascript互相调用
在C++程序中嵌入quickjs,可以构建一个强大的交互平台,让C++和javascript代码无缝协作。quickjs-ng作为快速的C++实现的javascript引擎,它支持跨平台应用,包括Linux和Windows。下面通过一个示例代码来展示如何在C++项目中集成quickjs,实现两种语言的双向通信。
首先,CMakeLists.txt文件是构建过程中的关键,它定义了如何链接quickjs库到你的C++项目中。通过这种方式,C++代码可以调用javascript函数,而javascript也能调用C++的接口。
接下来,sample.js和sample.hpp是示例中用于C++调用javascript的部分,它们展示了如何在javascript中定义函数,供C++调用。而在main.js中,你可以看到实际的javascript代码调用C++函数的示例。
在主程序中,你需要确保sample.js和main.js文件位于执行目录,以便于运行。通过这种方式,不仅可以实现一些C++和javascript单独使用时无法达成的功能,如代码热更新和安全隔离,而且在金融数据分析系统和游戏引擎等领域得到了广泛应用。
要查看完整的源码,你可以访问"quickjs_demo"项目。这将为你提供一个完整的集成quickjs到C++项目中的实践指南。