我目前正在阅读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(使用前将#替换为@)