如果在函数执行期间可能会更改指针参数,我是否应该使用 volatile 限定它们?

Should I qualify pointer parameters with volatile if they may be changed during the execution of a function?

假设我有这个功能

int foo(int * const bar){
    while(!*bar){
        printf("qwertyuiop\n");
    }
}

我打算将 bar 处的值更改为 0 以外的值以停止此循环。像下面这样写合适吗?

int foo(int volatile * const bar){
    while(!*bar){
        printf("qwertyuiop\n");
    }
}

volatile 用于 memory-mapped 设备寄存器之类的东西,其中 pointed-to 值可能由于所涉及硬件的性质而“在编译器的背后”“神奇地”改变.假设您没有编写处理可能“自发”更改 bar 指向的值的特殊硬件的代码,那么您不需要(也不应该)使用 volatile 关键字。简单地省略 const 关键字就足以让编译器(以及任何可能调用该函数的程序员)知道 pointed-to 值可能会发生变化。

请注意,如果您打算从另一个线程设置*bar ,那么volatile关键字就不够好;即使您将指针标记为 volatile,编译器仍不能保证正确处理。为了使 use-case 正常工作,您需要使用互斥锁同步对 *bar 的所有读取和写入,或者使用 std::atomic<int> 而不是普通的 int