c – 为什么摆脱挥发性是危险的?

c – 为什么摆脱挥发性是危险的?,第1张

概述在C中,volatile的处理方式与const相同:将指向volatile数据的指针传递给不希望volatile修饰符触发编译错误的函数. int foo(int* bar) { /* snip */ }int main(){ volatile int* baz; foo(baz); // error: invalid conversion from ‘volatile in 在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架构.)

总结

以上是内存溢出为你收集整理的c – 为什么摆脱挥发性是危险的?全部内容,希望文章能够帮你解决c – 为什么摆脱挥发性是危险的?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1234543.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存