讲师中心 微信公众号
AI工具推荐 视频效率加速

C++实现高效的内存置换FIFO _ 队列管理与命中率测试【实战】

浅浩君_7960

浅浩君_7960

发布时间:2026-04-13 19:43:09

|

459人浏览过

|

来源于php中文网

原创

不能只用 std::queue 实现 FIFO 页面置换,因其不支持查找,无法高效判断页面是否命中;需配合 std::unordered_set 维护页集合以实现 O(1) 命中检测,并同步更新队列与集合。

c++实现高效的内存置换fifo _ 队列管理与命中率测试【实战】

直接用 std::queue 模拟 FIFO 页面置换是可行的,但**不能只靠它完成命中判断和淘汰逻辑**——因为 std::queue 不支持遍历或查找,你每次访问页面时无法快速知道它是否已在内存中。

为什么不能只用 std::queue 做 FIFO 置换

FIFO 的核心动作有两步:1)查页是否在内存里;2)若不在且内存满,则弹出队首、插入新页。但 std::queue 只提供 front()、back()、push()、pop(),没有 find() 或迭代器暴露机制。

  • 如果你每次查命中都把整个队列倒出来再塞回去,时间复杂度是 O(n),实测在 320 次访问 + 3 物理块下会慢 5–8 倍
  • std::queue 底层默认是 std::deque,虽支持随机访问,但接口被封装掉了,强行转型或访问内部容器属于未定义行为
  • 很多教学代码用 vector + 手动维护头尾索引,看似“不用 STL”,实则更易越界、难调试

推荐组合:std::queue + std::unordered_set

用 std::queue 维护页面进入顺序,用 std::unordered_set 维护当前内存中的页号集合——两者同步更新,查命中只需 O(1) 平均时间。

  • 插入新页时:queue.push(page) + set.insert(page)
  • 淘汰页时:int victim = queue.front(); queue.pop(); set.erase(victim)
  • 查命中:if (set.find(page) != set.end()),比遍历数组快一个数量级
  • 注意:std::unordered_set 要求页号类型可哈希,int 默认支持,无需额外操作

命中率计算容易漏掉的边界

命中率不是简单用「命中次数 / 总访问次数」,必须明确「缺页中断」才触发计数,而「命中」不改变物理块内容,也不计入缺页。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

立即学习“C++免费学习笔记(深入)”;

  • 初始时物理块为空,第一次访问任何页都必然缺页,此时要先加载、再计数
  • 如果物理块大小为 0(极端输入),所有访问都缺页,但程序应提前报错而非崩溃
  • 测试序列含重复相邻页(如 0 0 0),第二个及之后的 0 是命中,但部分实现因忘记清空中间状态误判为缺页
  • 输出缺页率时建议用 printf("%.2f%%", 100.0 * cnt_miss / n),避免整数除法截断(如 5/13 直接得 0)

完整可运行的最小 FIFO 实现要点

以下逻辑足够跑通标准测试用例(如访问串 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1,块数=3):

  • 输入前先校验物理块数 m > 0 且访问序列非空
  • 用 std::queue<int></int> 存驻留页顺序,std::unordered_set<int></int> 存驻留页集合
  • 遍历每个访问页:if (set.count(page)) → 命中;否则 → 缺页,检查 queue.size() 决定是否淘汰
  • 淘汰时必须同时从 queue 和 set 移除同一页面,顺序不能颠倒(先 erase 再 pop 会导致 set 残留)
  • 最后输出缺页次数、缺页率、命中率三个值,别只打一个

真正卡住人的从来不是算法思想,而是 set 和 queue 同步时机、空块处理、浮点输出精度这三处细节。

热门AI工具

更多
立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3448

2023.11.20

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

848

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1029

2023.11.28

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6799

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3265

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4248

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2905

2025.08.29

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3188

2023.10.19

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn