在C中,volatile的处理方式与const相同:将指向volatile数据的指针传递给不希望volatile修饰符触发编译错误的函数.
int foo(int* bar) { /* snip */ } int main() { volatile int* baz; foo(baz); // error: invalid conversion from ‘volatile int*’ to ‘int*’ }
为什么危险?对于const修饰符来说很明显,删除它会破坏const的正确性;但是有没有“不稳定的正确性”这样的东西?我无法弄清楚如何将指向易失性数据的指针作为非易失性数据的指针传递可能会导致问题.
编辑只是让你们知道为什么我首先使用volatile:许多Mac OS X的OSAtomic系列函数(用于原子增量,减量,加法,减法,比较和交换等)都需要使用volatile参数.
解决方法
编译器不仅可以优化对非易失性变量的访问,只要程序的顺序执行不受影响,它就可以预测性地/推测性地更新它们.
如果对volatile变量的虚假写入不会破坏您的设计,则可能不需要在任何上下文中使用volatile.
例如,C 03编译器进行转换是完全合法的
int result; void sum_if_all_positive( std::array<N> ary ) { int sum = 0; result = -1; for( int i = 0; i < N; ++i ) { if (ary[i] < 0) return; sum += ary[i]; } result = sum; }
成
int result; void sum_if_all_positive( std::array<N> ary ) { result = 0; for( int i = 0; i < N; ++i ) { if (ary[i] < 0) { result = -1; return; } result += ary[i]; } }
(虽然这种改变提供的性能比仅在少数具有廉价存储器访问和极少数寄存器的架构上注册总和的性能更好.想到Microchip PIC架构.)