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
.)
从您链接到的页面:
另一方面,如果你有一个指针变量,其中地址本身是易失性但指向的内存不是那么我们有:
Run Code Online (Sandbox Code Playgroud)int * volatile x;
更新:对不起,我错过了你的这部分问题:
那么为什么某些函数参数被声明为volatile?
大概是因为它指向的数据可能以编译器不一定知道的方式改变.该volatile
关键字用于防止编译器应用优化,假设数据不会以其不知道的方式更改.