介绍
过去几天关于 DLL 的争论相当激烈,在这篇文章中我想添加一个不同的观点:为什么在编写 DLL 时应该使用数组而不是指针。
什么是 DLL——双向链表?
这方面有很多资源,其中一些:
DLL的使用案例:
- 浏览器历史记录(后退和前进导航)。
- 音乐播放器播放列表。
- 撤消/重做功能。
- 实现复杂的数据结构:LRU(最近最少使用)缓存。
- 文本编辑器和 IDE。
- 操作系统调度。
C 中的代码
我将在 Neovim 中使用 diff 提供代码。起初它在视觉上看起来很吵,但过了一会儿你会发现它有助于理解两个版本之间的差异:使用指针与使用数组。
==–注意–==:在 PC 上,您需要“在新选项卡中打开图像”,然后双击图像才能放大。在手机上,您只需缩放即可放大图像。
亮点
左分割中的指针:
- createNode 函数创建新节点并进行手动内存分配。
右侧分割的数组:
- initializeArray 函数:一个简单的 for 循环。
第二张图片中没有什么特别有趣/值得注意的地方。如果您使用指针,请不要忘记释放内存!
基准
我们已经到了我最喜欢的部分:让我们运行一些长凳!
数组版本的运行速度比指针版本快 4.39 倍
结论
就这样,使用数组编写 DLL 既更快又更安全。为什么更安全?您需要了解为什么使用原始指针是危险的并且容易出现内存错误。
使用数组的一些优点:
- 更简单:无需手动内存管理。
- 由于连续内存,访问速度更快(更好的缓存局部性)。
使用指针的一些缺点:
- 复杂:需要进行手动内存管理(分配和释放)。
- 进程较慢,每次都必须分配内存。
- 容易出现内存错误(悬空指针)。
我保持这篇文章简短明了,因为我想指出甚至传播这个词,以规范在 C 编程中使用数组而不是指针。
注意:我使用 gcc -O3 优化级别编译了这两个程序。此外,我还为我在 Bearblog 中发布的代码创建了一个新的 Github Gist 存储库,因此今后我不再使用 Pastebin,而是使用 Github Gist。这是我的第三个 Github 帐户,为什么你会问多个帐户?这是我进行“关注点分离”或“划分”的方式:1 个用于工作内容,1 个用于业余爱好/业余项目,1 个用于 Bearblog 代码。
要点代码仓库:
原文: https://hwisnu.bearblog.dev/doubly-linked-list-pointers-vs-arrays/