如何在C++中执行缓存操作
How to perform cache operations in C++?
我想在刷新缓存后运行我的C++程序,在运行我的程序之前,我不知道缓存中有什么。在 Ubuntu 上是否有其他C++方式,我可以在运行程序之前刷新缓存。
编辑:刷新缓存的动机是...每次我运行程序时,我都不希望我现在的数据结构存在于缓存中......我的意思是我想要一个冷缓存...由此,所有访问都是从磁盘进行的。
实现此目的的一种方法是重新启动计算机...但考虑到我必须运行的实验数量,这对我来说是不可行的。所以,谁能好心地指导我如何实现这一目标。
您无需从用户模式(非内核模式)程序中刷新缓存。 操作系统(Linux,在ubuntu的情况下)为您的应用程序提供了一个全新的虚拟地址空间,没有来自其他程序的"剩余内容"。 如果不执行特殊的操作系统系统调用,您的程序甚至无法访问用于其他应用程序的内存。 因此,从缓存的角度来看,就其而言,您的应用程序从头开始。 有 cacheflush() 系统调用(语法因操作系统而异),但除非您对典型的用户模式应用程序执行一些不寻常的操作,否则您可能会忘记缓存甚至存在;它只是为了加速你的程序,操作系统通过CPU的MMU管理它,你的应用程序不需要管理它。
您可能还听说过"内存泄漏"(分配给应用程序的内存,您的应用程序忘记释放/删除,一旦您的应用程序忘记它,它就会"永远丢失")。 如果您正在编写一个(可能)长时间运行的程序,那么内存泄漏绝对是一个问题。 但是泄漏的内存只是泄漏它的应用程序的问题;在现代虚拟内存环境中,如果应用程序 A 泄漏内存,则不会影响应用程序 B。 当应用程序 A 退出时,操作系统会清除其虚拟地址空间,此时任何泄漏的内存都将被系统回收,不再消耗任何系统资源。 在许多情况下,程序员专门选择不释放/删除内存分配,因为他们知道操作系统将在应用程序退出时自动回收全部内存量。 这种策略没有错,只要程序不继续重复这样做,耗尽其虚拟地址空间。
常见的问题。
首先,你必须明白,缓存永远不会是真正空的,就像寄存器永远不会真正空一样,它总是在那里,它总是有一个值。短语"刷新缓存"实际上是指将缓存内容写入内存,也称为内存屏障。见 https://en.wikipedia.org/wiki/Memory_barrier
这不是你的问题,所以你使用了错误的术语。
您真正想要的是用错误的值填充缓存。这比听起来更难,因为您正在与通常属于您朋友的所有优化作斗争。内存块(几 MB - 考虑到今天的缓存大小)应该正常工作。
然而。。。
您还有文件缓存和其他会给您的应用程序带来不公平优势的东西。这可能是一个非常复杂的主题,本身就是一个小项目。
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 执行函数时导致崩溃的变量
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 在C++中对T*类型执行std::move的意外行为
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何在没有信号的情况下从C++执行QML插槽
- 如何确认我的constexpr表达式实际上已经在编译时执行
- C++17中的并行执行策略
- cmake更新缓存的变量
- QML按钮点击功能执行顺序
- 试图对缓存进行跨步测试,但程序并没有结束
- 程序在执行程序的其余部分之前退出
- 为什么catch中的代码没有被执行
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 如何在C++中执行缓存操作
- 频繁执行的表达式是否会缓存其结果