如果在函数执行期间可能会更改指针参数,我是否应该使用 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
。
假设我有这个功能
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
。