CPU cache 是什么?

发布: (2026年1月16日 GMT+8 11:24)
2 min read
原文: Dev.to

Source: Dev.to

CPU 缓存概述

Cache 用中文可以说成“临时存储区”。CPU 中有 L1、L2、L3 缓存,分别是

  • L1 – 每个核心自动拥有(容量 ≈ 32 KB)
  • L2 – 每个核心拥有(容量 ≈ 256 KB)
  • L3 – 所有核心共享的缓存(容量很大)

CPU 在读取一条指令时会先在 L1 缓存中查找。如果在 L1 中找到了数据,可以在 3‑5 个周期内取出,速度非常快。若 L1 未命中,则继续在 L2(10‑15 周期)查找;若仍未命中,则去 L3(50‑100 周期)继续查找。

缓存友好代码

在 C++ 中,缓存友好的基本做法是 row‑major 访问

不友好(cache‑unfriendly)代码

for (int col = 0; col < N; ++col) {
    for (int row = 0; row < N; ++row) {
        sum += matrix[row][col];
    }
}

缓存高效(row‑major)代码

for (int row = 0; row < N; ++row) {
    for (int col = 0; col < N; ++col) {
        sum += matrix[row][col];
    }
}

为什么 row‑major 访问是缓存友好的?

二维数组示例

int matrix[4][4] = {
    { 1,  2,  3,  4},  // row 0
    { 5,  6,  7,  8},  // row 1
    { 9, 10, 11, 12},  // row 2
    {13, 14, 15, 16}   // row 3
};

内存布局(地址)

元素地址
matrix[0][0]10x1000
matrix[0][1]20x1004
matrix[0][2]30x1008
matrix[0][3]40x100C
matrix[1][0]50x1010
matrix[1][1]60x1014
matrix[1][2]70x1018
matrix[1][3]80x101C
matrix[2][0]90x1020
matrix[2][1]100x1024
matrix[2][2]110x1028
matrix[2][3]120x102C
matrix[3][0]130x1030
matrix[3][1]140x1034
matrix[3][2]150x1038
matrix[3][3]160x103C

在 C++ 中采用 row‑major 排列时,同一行内的元素在内存中相邻,间隔为 4 bytes(int)。

CPU 在首次访问 matrix[0][0] 时,如果未命中,会一次性把 64 byte 大小的 cache line 从内存加载进来。这个 cache line 包含 matrix[0][0]、matrix[0][1]、matrix[0][2]…,即整行的数据。因此在循环中访问 matrix[0][1]、matrix[0][2] 等时,CPU 能直接从缓存中以 4 bytes 的步长快速读取,显著提升执行速度。

Back to Blog

相关文章

阅读更多 »

Rapg:基于 TUI 的密钥管理器

我们都有这种经历。你加入一个新项目,首先听到的就是:“在 Slack 的置顶消息里查找 .env 文件”。或者你有多个 .env …

HackPrix 第一季回顾

概述 介绍 HackPrix,这是 HackPrix 社区的一项倡议——一个创新与专业相结合、让创意得以绽放的空间。HackPrix Sea...

构建 Quincy 的求职技巧页面

介绍 今天上午,我开始完成 freeCodeCamp 响应式网页设计(Responsive Web Design)认证中的下一个工作坊:构建一个求职技巧页面。该工作坊提供…