Skip to content

搞英语 → 看世界

翻译英文优质信息和名人推特

Menu
  • 首页
  • 作者列表
  • 独立博客
  • 专业媒体
  • 名人推特
  • 邮件列表
  • 关于本站
Menu

双向链表 – 指针与数组

Posted on 2025-01-22

介绍

过去几天关于 DLL 的争论相当激烈,在这篇文章中我想添加一个不同的观点:为什么在编写 DLL 时应该使用数组而不是指针。

什么是 DLL——双向链表?

这方面有很多资源,其中一些:

  1. 极客之极客
  2. 编程

DLL的使用案例:

  • 浏览器历史记录(后退和前进导航)。
  • 音乐播放器播放列表。
  • 撤消/重做功能。
  • 实现复杂的数据结构:LRU(最近最少使用)缓存。
  • 文本编辑器和 IDE。
  • 操作系统调度。

C 中的代码

我将在 Neovim 中使用 diff 提供代码。起初它在视觉上看起来很吵,但过了一会儿你会发现它有助于理解两个版本之间的差异:使用指针与使用数组。

==–注意–==:在 PC 上,您需要“在新选项卡中打开图像”,然后双击图像才能放大。在手机上,您只需缩放即可放大图像。

亮点
左分割中的指针:

  • createNode 函数创建新节点并进行手动内存分配。

右侧分割的数组:

  • initializeArray 函数:一个简单的 for 循环。

DLL-00

第二张图片中没有什么特别有趣/值得注意的地方。如果您使用指针,请不要忘记释放内存!

DLL-01

基准

我们已经到了我最喜欢的部分:让我们运行一些长凳!

dll-bench-00

数组版本的运行速度比指针版本快 4.39 倍

结论

就这样,使用数组编写 DLL 既更快又更安全。为什么更安全?您需要了解为什么使用原始指针是危险的并且容易出现内存错误。

使用数组的一些优点:

  1. 更简单:无需手动内存管理。
  2. 由于连续内存,访问速度更快(更好的缓存局部性)。

使用指针的一些缺点:

  1. 复杂:需要进行手动内存管理(分配和释放)。
  2. 进程较慢,每次都必须分配内存。
  3. 容易出现内存错误(悬空指针)。

我保持这篇文章简短明了,因为我想指出甚至传播这个词,以规范在 C 编程中使用数组而不是指针。



注意:我使用 gcc -O3 优化级别编译了这两个程序。此外,我还为我在 Bearblog 中发布的代码创建了一个新的 Github Gist 存储库,因此今后我不再使用 Pastebin,而是使用 Github Gist。这是我的第三个 Github 帐户,为什么你会问多个帐户?这是我进行“关注点分离”或“划分”的方式:1 个用于工作内容,1 个用于业余爱好/业余项目,1 个用于 Bearblog 代码。

要点代码仓库:

  • 指针_dll.c 、数组_dll.c

原文: https://hwisnu.bearblog.dev/doubly-linked-list-pointers-vs-arrays/

本站文章系自动翻译,站长会周期检查,如果有不当内容,请点此留言,非常感谢。
  • Abhinav
  • Abigail Pain
  • Adam Fortuna
  • Alberto Gallego
  • Alex Wlchan
  • Answer.AI
  • Arne Bahlo
  • Ben Carlson
  • Ben Kuhn
  • Bert Hubert
  • Big Technology
  • Bits about Money
  • Brian Krebs
  • ByteByteGo
  • Chip Huyen
  • Chips and Cheese
  • Christopher Butler
  • Colin Percival
  • Cool Infographics
  • Dan Sinker
  • David Walsh
  • Dmitry Dolzhenko
  • Dustin Curtis
  • eighty twenty
  • Elad Gil
  • Ellie Huxtable
  • Ethan Dalool
  • Ethan Marcotte
  • Exponential View
  • FAIL Blog
  • Founder Weekly
  • Geoffrey Huntley
  • Geoffrey Litt
  • Greg Mankiw
  • Henrique Dias
  • Hypercritical
  • IEEE Spectrum
  • Investment Talk
  • Jaz
  • Jeff Geerling
  • Jonas Hietala
  • Josh Comeau
  • Lenny Rachitsky
  • Li Haoyi
  • Liz Danzico
  • Lou Plummer
  • Luke Wroblewski
  • Maggie Appleton
  • Matt Baer
  • Matt Stoller
  • Matthias Endler
  • Mert Bulan
  • Mind Matters
  • Mostly metrics
  • Naval Ravikant
  • News Letter
  • NextDraft
  • Non_Interactive
  • Not Boring
  • One Useful Thing
  • Phil Eaton
  • Product Market Fit
  • Readwise
  • ReedyBear
  • Robert Heaton
  • Rohit Patel
  • Ruben Schade
  • Sage Economics
  • Sam Altman
  • Sam Rose
  • selfh.st
  • Shtetl-Optimized
  • Simon schreibt
  • Slashdot
  • Small Good Things
  • Steph Ango
  • Stephen Wolfram
  • Steve Blank
  • Taylor Troesh
  • Telegram Blog
  • The Macro Compass
  • The Pomp Letter
  • thesephist
  • Thinking Deep & Wide
  • Tim Kellogg
  • Understanding AI
  • Wes Kao
  • 英文媒体
  • 英文推特
  • 英文独立博客
©2025 搞英语 → 看世界 | Design: Newspaperly WordPress Theme