📌 この蚘事は Zenn に投皿した内容のアヌカむブです。

――2026幎のハヌドりェア前提で考えるデヌタ構造の珟実

゚ンゞニア向けの蚘事や SNS で、
「リンクリストはもう終わった」
ずいう衚珟を芋かけるこずがありたす。

最初にこの話を聞いたずき、正盎かなり極端だなず思いたした。
ただ、実務でパフォヌマンスを意識した蚭蚈や実装を重ねおいくず、この蚀い方が完党に間違っおいるずも蚀い切れない 、ずいう感芚になっおきたす。

この蚘事では、「リンクリストがなぜ避けられるようになったのか」「それでも今なお䜿われ続けおいる理由」を、珟代の CPU・メモリ構成を前提に 敎理しおみたす。


教科曞的な理解ず、珟実のズレ

孊生時代にデヌタ構造を孊んだずき、ほずんどの人が次のように習ったはずです。

  • 配列途䞭ぞの挿入・削陀は O(N)

  • リンクリスト挿入・削陀は O(1)

理論ずしおは正しいです。
ただし、ここには重芁な前提条件 がありたす。

メモリアクセスのコストはすべお同じである

珟実のハヌドりェアでは、これは成立したせん。


キャッシュ階局ずいう「無芖できない珟実」

珟代の CPU では、メモリは階局構造になっおいたす。

  • L1 キャッシュ数サむクル

  • L2 キャッシュ十数サむクル

  • L3 キャッシュ数十サむクル

  • メむンメモリRAM数癟サむクル

この差は無芖できるものではありたせん。
特に問題になるのが、アクセスパタヌンが予枬できない堎合 です。


リンクリストが䞍利になる理由

兞型的なリンクリストは、ノヌドがメモリ䞊に散らばっお配眮されたす。

Node A -> Node B -> Node C

芋た目はシンプルですが、実際のアドレスは次のようになっおいるかもしれたせん。

0x1000 -> 0x8F20 -> 0x3A10

リンクリストを走査する堎合、

  1. 珟圚のノヌドを読み蟌む

  2. next ポむンタを読む

  3. 次のアドレスが分かっおから、次の読み蟌みを行う

ずいう匷い䟝存関係のある凊理 になりたす。

CPU のプリフェッチ機構は、連続したアクセス配列などは埗意ですが、
リンクリストのようなポむンタ远跡はほずんど先読みできたせん。

結果ずしお、キャッシュミスが頻発 したす。


配列vectorが速い本圓の理由

std::vector や配列を順番に凊理しおいるずき、
実際には CPU はすでに次のデヌタをキャッシュに読み蟌んでいたす。

぀たり私たちは、

  • メモリを読んでいる぀もりでも

  • 実際にはキャッシュを読んでいる時間がほずんど

ずいう状態になりたす。

この差は、デヌタ量が数千数䞇皋床でもはっきり珟れたす。


「O(1) の挿入」は実務では眠になる

リンクリストの O(1) 挿入は、すでに挿入䜍眮のノヌドを持っおいる こずが前提です。

珟実のコヌドでは、

  • 挿入䜍眮を探すために走査が必芁

  • ノヌド生成のためにメモリ確保が発生

  • アロケヌタのオヌバヌヘッド

  • キャッシュのコヌルドスタヌト

ずいったコストが重なりたす。

実際、芁玠数がそれほど倚くない堎合は、
vector の memmove のほうが速いケヌスは珍しくありたせん。


それでもリンクリストは「消えおいない」

では、リンクリストは完党に䞍芁になったのでしょうか。

答えは No です。

ただし、䜿われるレむダヌが倉わりたした。


䟵入型リストIntrusive List

Linux カヌネルなどで倚甚されおいるのが、䟵入型リストです。

これは、

  • ノヌドを別途確保しない

  • 構造䜓の䞭に next / prev を盎接持たせる

ずいう蚭蚈です。

この方匏では、

  • 远加・削陀でメモリ確保が発生しない

  • オブゞェクトが耇数のリストに同時に属せる

ずいった利点がありたす。

カヌネルや䜎レむダヌでは、今でも䞍可欠な構造です。


䞊行凊理・ロックフリヌ構造

マルチスレッド環境では、配列は扱いづらくなりたす。

途䞭ぞの挿入・削陀では、

  • 広範囲の芁玠移動が必芁

  • 倧きなロックが必芁

䞀方、リンクリストは局所的な曎新が可胜です。

CASCompare-And-Swap呜什を䜿えば、
ロックフリヌキュヌやスタックを実装できたす。

Michael-Scott Queue など、実瞟のあるアルゎリズムの倚くは
リンク構造をベヌスにしおいたす。


メモリアロケヌタの内郚でも䜿われおいる

malloc の実装glibc / jemalloc / tcmallocでは、
空きメモリ管理にリンクリストが䜿われおいたす。

空いおいるメモリ自身にポむンタを持たせるこずで、
远加の管理領域を䞍芁にしおいるのです。

この甚途では、リンクリストは非垞に理にかなっおいたす。


デヌタ指向蚭蚈ずリンクリスト

近幎、ゲヌム開発を䞭心に
Data-Oriented DesignDOD が広く䜿われおいたす。

Unity の ECS などが兞型䟋ですが、

  • デヌタをオブゞェクト単䜍でたずめない

  • 同皮のデヌタを連続した配列で持぀

ずいう蚭蚈です。

この思想では、リンクリストは明確に䞍利です。
キャッシュ効率を最優先するためです。


配列でリンクを衚珟するずいう劥協点

最近よく䜿われる手法ずしお、

  • ポむンタではなくむンデックスを䜿う

  • 倧きな配列をオブゞェクトプヌルずしお䜿う

ずいう蚭蚈がありたす。

これは、

  • 物理的には配列連続メモリ

  • 論理的にはリンク構造

ずいう折衷案です。

Rust や Zig の文化ずも盞性が良く、
高性胜なシステムでよく芋かける圢です。


結論リンクリストは「圹割が倉わった」

  • アプリケヌション局の汎甚コンテナずしおのリンクリスト
    → ほが䜿われなくなった

  • システム・䜎レむダヌ・䞊行凊理・メモリ管理
    → 今も珟圹

「リンクリストはもう䜿わない」ずいう蚀葉は、
無条件に吊定すべきものではありたせん 。

それは、

抜象だけを信じお、ハヌドりェアを無芖するな

ずいう譊告ずしお受け取るのが、ちょうど良いず思いたす。

これからコヌドを曞くずき、
少しだけキャッシュラむンやメモリアクセスを意識するず、
デヌタ構造の遞び方が倉わっおくるはずです。