为什么将函数参数标记为volatile

dme*_*ter 19 c parameters volatile

我目前正在阅读PostgreSql代码.以下是缓冲区管理器的摘录:

static void WaitIO(volatile BufferDesc *buf);
static bool StartBufferIO(volatile BufferDesc *buf, bool forInput);
static void TerminateBufferIO(volatile BufferDesc *buf, bool clear_dirty,
Run Code Online (Sandbox Code Playgroud)

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

当在类型定义中使用关键字volatile时,它会向编译器指示它应如何处理变量.它主要告诉编译器,由于程序外部的操作或当前执行行,变量的值可能随时发生变化.(来源)

那么为什么某些函数参数被声明为volatile?我不希望DMA改变指针位置.那么这里发生了什么?

T.J*_*der 19

volatile BufferDesc *buf表示buf 指向的数据是易失性的,而不是包含的指针buf是易失性的.(那就是BufferDesc * volatile buf.)

您链接到的页面:

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

int * volatile x;
Run Code Online (Sandbox Code Playgroud)

更新:对不起,我错过了你的这部分问题:

那么为什么某些函数参数被声明为volatile?

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


glg*_*lgl 7

我不希望DMA改变指针位置.

不是位置,而是内容.而这正是它的意义......