
今天学习了 volatile 的陷阱,但是有些论坛上的东西都是有一个原版,然后之后的都是大家相互拷贝,拷贝归拷贝,至少得先理解原文的意思吧,或者写完后还是检查以下,虽然掉的东西很少,但是意思就差的很大了。原文这里就不拷贝了,这里说一下其中的错误之处: 例:到底哪个volatile可能无效 就在你看过前面几个例子,感觉自己可能已经都弄明白了的时候,请看最后这个例子:
请问上面标记了①和②的两行代码,哪个是确实在访问volatile对象,而哪个又是undefined的结果? 答案是:②是volatile的,①是undefined。来看本例的数据结构示意图: (non-volatile) bdp -->+-------------+ | | | ... ... | | | +-------------+ (volatile) | buffer |-->+------------+ +-------------+ | | | | | | +------------+ | buffer | +------------+ | | | | +------------+buffer成员本身是通过一个non-volatile的指针bdp访问的,按照C99标准的定义,这就属于undefined的情况,因此对bdp->buffer的访问编译器不一定能保证是volatile的; 虽然buffer成员本身可能不是volatile的变量,但是buffer成员是一个指向volatile对象的指针。因此对buffer成员所指对象的访问编译器可以保证是volatile的,所以bdp->buffer是volatile的。 最后分享一下原文的链接(我认为的原为,这里仅作知识分享,如涉及到版权等问题,请告知,立即删除): volatile的陷阱(栢图实验室) 或者 volatile的陷阱(栢图实验室) 好记性不如烂笔头... |
多谢!应该是这样的
结构体的指针因为不是volatile, 所以所有成员就是定义了volatile也没用, 那又何必把成员定义为volatile呢, 就是说要不就整个结构体都是volatile, 要不就都不是volatile。
再者 volatile unsigned char * volatile buffer; 这一句的意思是, 指针是volatile, 指针所指向的内容也是volatile
要知道加volatile本身如非必要就是个额外的损耗。
要是定义另一 unsigned char *buf = bdp->buffer;
buf[0]=xx;
结果是undefin才是合理的
但因为结构体指针不是volatile而影响到成员就不合理了
点评