C++的volatile关键字

 在C++中,我们经常用const关键字来修饰一个变量,来告诉编译器这个变量是不可改变的,如果有代码企图改变这个变量,那么编译无法通过。在C++中,还有一个volatile关键字,表达着与const大概相反的意思,就是告诉编译器,volatile修饰的变量是非常容易发生变化的,从而避免编译器做出的某些优化行为。

编译器优化行为

 考虑下面这一段代码

int some_int = 100;

while(some_int == 100)
{
    
    
   //your code
}

 这段代码在编译时,如果编译器没有发现任何代码有企图修改some_int的行为,则编译器会试图进行一些优化行为,例如,将while(some_int)优化为while(true),这样,程序在执行的时候会变的更快,因为在some_int在不被改变的情况下,while内的条件总为真。如果编译器不对这里进行优化,那程序每次都要获取到some_int的值,然后与100进行比较,相比之下,这样会慢一些。

 然而,有时候,编译优化并不是我们预期的,因为可能存在一些编译器无法察觉的地方在修改some_int这个变量。这种情况下,编译器的优化行为会完全改变这段代码的本意,出现预期外的行为。

《C++ Primer》《Effective C++》是C++开发者必不可少的书籍,如果你想入门C++,以及想要精进C++开发技术,这两本书可以说必须要有。此外,《Linux高性能服务器编程》以及《Linux多线程服务端编程:使用muduo C++网络库》.(陈硕)》是快速提高你的linux开发能力的秘籍。在网上搜索相关资源也要花费一些力气,需要的同学可以关注公众号【程序员DeRozan】,回复【1207】快速免费领取~

volatile关键字

 为了保证程序的运行是预期的,我们需要显式的告诉编译器,不要优化这个while循环,这时候就需要用到volatile关键字了,这也就是volatile关键字的作用。我们需要做的仅仅是在变量名前添加volatile:

volatile int some_int = 100; //note the 'volatile' qualifier now!

 一段特别有意思的话来解释volatile关键字的作用:

“Hey compiler, I’m volatile and, you know, I can be changed by some XYZ that you’re not even aware of. That XYZ could be anything. Maybe some alien outside this planet called program. Maybe some lightning, some form of interrupt, volcanoes, etc can mutate me. Maybe. You never know who is going to change me! So O you ignorant, stop playing an all-knowing god, and don’t dare touch the code where I’m present. Okay?”

 对于一个类或者结构体,如果使用volatile关键字修饰类对象或者结构体对象,则这个对象内的数据,被声明为了volatile,这里和const的行为类似。

struct whatever {
    
     int data; };

const whatever test;

猜你喜欢

转载自blog.csdn.net/dddgggd/article/details/129460814
今日推荐