为什么将函数参数标记为易失性

2023-12-31

我目前正在阅读PostgreSQL https://github.com/postgres/postgres代码。以下是缓冲区管理器的摘录:

static void WaitIO(volatile BufferDesc *buf);
static bool StartBufferIO(volatile BufferDesc *buf, bool forInput);
static void TerminateBufferIO(volatile BufferDesc *buf, bool clear_dirty,

我知道 volatile 关键字通常用于设备驱动程序和嵌入式系统中。有关键字的解释。

当在类型定义中使用关键字 volatile 时,它​​向编译器指示应如何处理变量。主要是告诉编译器,由于程序或当前执行行外部的操作,变量的值可能随时发生变化。 (Source https://web.archive.org/web/20140329054504/http://www.cognitus.net:80/html/tutorial/usingVolatile.html)

那么为什么某些函数参数被声明为易失性呢?我不希望 DMA 改变指针位置。那么这里会发生什么呢?


volatile BufferDesc *buf意味着数据buf 指着是易失性的,而不是包含的指针buf是不稳定的。 (那将是BufferDesc * volatile buf.)

From 您链接到的页面 https://web.archive.org/web/20140329054504/http://www.cognitus.net:80/html/tutorial/usingVolatile.html:

另一方面,如果你有一个指针变量,其地址本身是易失性的,但指向的内存不是易失性的,那么我们有:

int * volatile x;

关于你问题的这一部分:

那么为什么某些函数参数被声明为易失性呢?

大概是因为它指向的数据可能会以编译器不一定知道的方式发生变化。这volatile关键字的作用是防止编译器应用假设数据不会以它不知道的方式更改的优化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么将函数参数标记为易失性 的相关文章

随机推荐

  • ggplot:同时通过“geom_rect”排列因子顺序并突出显示区域

    首先 指定分类变量顺序的方法ggplot是重新排序它的级别data frame 其次 要在我们可以使用的任何绘图上突出显示一个区域geom rect 这里需要注意的是 不要将数据传递给geom rect 否则它不允许我们设置alpha 因此
  • 在 Haskell 中操作元组

    我是 Haskell 的新手 我有一个关于元组的问题 难道就没有遍历元组的方法吗 我知道使用列表进行遍历非常容易 但是如果输入作为元组给出 是否没有办法像使用列表一样检查整个元组 如果不是这种情况 是否可以将元组中的值提取到列表中并以这种方
  • 全屏纹理 iPhone OpenGL ES

    我知道 iPhone 上的 OpenGL 纹理需要是 2 的幂 OpenGL 2 0 也是如此吗 如果我有一个尺寸为 320 x 480 的图像并且想要将其全屏绘制 是否有任何可能的方法可以使用 OpenGL 来完成此操作 Thanks N
  • 如何使用 async/await 在 Node.js 中异步创建ReadStream

    我在使用时遇到困难fs creadReadStream异步处理我的 csv 文件 async function processData row perform some asynchronous function await someAsy
  • 二分查找条件中何时使用“=”?

    我对何时使用的场景感到很困惑 在二分查找中 例如 这是我从 wiki 中找到的 其中使用 while imin lt imax int binary search int A int key int imin int imax contin
  • ios 设置包中的简单标题输出

    我只想在设置文件中输出我的 ios 应用程序的版本号 我知道我必须将设置文件添加到应用程序文件夹中 当我构建并运行时 我可以看到标准设置包附带的 4 个设置 为了获得一个简单的只读字符串 我将第二个值更改为以下 在代码 didFinishL
  • 检查一个列表是否包含另一个列表中的元素

    我有两个列表 其中包含不同的对象 List
  • 如何使用具有不同对象的“repeating:count:”来初始化数组? [复制]

    这个问题在这里已经有答案了 令人惊讶的是 下面的代码打印SAME而初始化程序应该调用Z 每次构造函数 如何使用此方法与不同的实例初始化数组Z import Foundation class Z var i Int 0 var z Z Z r
  • 英特尔 XDK:将您的移动应用连接到数据库

    我目前正在开发一个应用程序 如果我没有数据库 构建后的应用程序将会很重 如何将应用程序连接到本地或远程数据库 提前致谢 您可以使用以下方法之一来使用数据库 1 使用 HTML5 客户端数据库 HTML5 在本地客户端计算机上提供四种不同类型
  • 如何在交互式会话中重置下划线? [复制]

    这个问题在这里已经有答案了 我已经覆盖了下划线变量 在Python交互式解释器中 如何在不重新启动解释器的情况下使下划线再次工作 del 一个全球性的 shadows https en wikipedia org wiki Variable
  • 如何在 PHP 中使用 SerializeArray 值?

    我从表单中获得了调整大小 resize resize form serializeArray 我把调整大小放在隐藏中并将其发送到php页面 如何在php中获取调整大小值
  • React-Bootstrap / React-Router-Bootstrap 中导航栏品牌的最佳实践

    存在关于锚标记的问题反应引导 and 反应路由器 我很好奇其他人是如何处理这种情况的 可以只留下带有 href 的锚标记 例如 a href Site Title a 并避免使用IndexLinkContainer 还有使用MenuItem
  • 将错误消息设置为英语不起作用

    由于某种原因 我无法更改 PostgreSQL 错误消息的语言 我尝试在脚本内设置语言以在第一行创建架构 SET lc messages TO en US UTF 8 我也做了this https stackoverflow com que
  • 序列化修改记录时,belongsTo 承诺未解决

    好的 必填信息 DEBUG DEBUG Ember 1 3 1 DEBUG Ember Data 1 0 0 beta 7 f87cba88 DEBUG Handlebars 1 0 0 DEBUG jQuery 1 10 2 DEBUG
  • SSH.NET SFTP 递归获取目录和文件列表

    我正在使用 Renci SshNet 库通过 SFTP 递归获取文件和目录列表 我可以连接 SFTP 站点 但我不确定如何在 C 中递归获取目录和文件列表 我还没有找到任何有用的例子 有人尝试过这个吗 如果是这样 您可以发布一些有关如何递归
  • 将 stdout 和 stderr 重定向到 syslog

    在一个程序中 我希望将所有 printfs 写入系统日志 我将所有 printf 替换为 syslog 因此我想到将 stdout 和 stderr 重定向到 syslog 为此我尝试了以下代码 int main FILE fl fl po
  • Jquery - 使用两者时区分同一输入上的“点击”和“焦点”

    如果单击输入 我试图在输入上触发事件or如果输入成为焦点 我遇到的问题是阻止事件在单击时触发两次 因为显然 单击输入也会使其成为焦点 我在 jfiddle 上放了一个非常宽松的版本来向您展示我的意思 代码如下 HTML
  • 如何有效计算缩放比例?

    我有一个包含在框中的可拖动图像 您可以放大和缩小框中的图像 这将使图像变大或变小 但框大小保持不变 该框的高度和宽度将随着浏览器大小的调整而变化 图像的顶部和左侧值将在拖动时发生变化 我试图将框在图像中居中的任何点保留在中心 有点像 Goo
  • Windows 中公钥和私钥容器的位置?

    我尝试使用以下代码将我的公钥和私钥存储在容器中 CspParameters cp new CspParameters cp KeyContainerName Test RSACryptoServiceProvider rsa new RSA
  • 为什么将函数参数标记为易失性

    我目前正在阅读PostgreSQL https github com postgres postgres代码 以下是缓冲区管理器的摘录 static void WaitIO volatile BufferDesc buf static bo