C/C++ 中volatile用法
2015-09-20 09:46
302 查看
当用volatile去修饰一个变量的时候,表明这个变量很可能被其他地方修改
举个例子:
volatile 就是告诉编译器,不要去试图优化看起多余的读或者写操作。
这里clock_register 前面没有volatile去修饰它,编译器就会只读一次clock_register,并且认为t1==t2.
除非是底层直接操作硬件的代码,不要去使用volatile.
讲到这里,应该说,已经讲完了,下面这段话是摘抄自陈正冲《C语言深度解剖》,相信你看完之后,会有更深入的理解
如果,到这里,你还是不能明白,那我就举一个实实在在的例子:
下面代码是取自linux 和uefi
change directory 到driver 目录下面,然后执行 grep
drivers]$ grep -r volatile
我们会发现linux kernel 里面大量用到了volatile
arisc/sba_iommu.c: asm volatile("sync" : : );
parisc/sba_iommu.c: asm volatile("syncdma");
parisc/sba_iommu.c: asm volatile("sync" : : );
parport/parport_ip32.c: /* Note: ctxreg is "volatile" here only because
parport/parport_ip32.c: * "volatile". */
parport/parport_ip32.c: volatile u64 __iomem *ctxreg = (parport_ip32_dma.ctx == 0) ?
parport/parport_mfc3.c:static volatile int dummy; /* for trigger readds */
pci/hotplug/shpchp.h: volatile u32 base_offset;
pci/hotplug/shpchp.h: volatile u32 slot_avail1;
pci/hotplug/shpchp.h: volatile u32 slot_avail2;
pci/hotplug/shpchp.h: volatile u32 slot_config;
pci/hotplug/shpchp.h: volatile u16 sec_bus_config;
pci/hotplug/shpchp.h: volatile u8 msi_ctrl;
pci/hotplug/shpchp.h: volatile u8 prog_interface;
pci/hotplug/shpchp.h: volatile u16 cmd;
pci/hotplug/shpchp.h: volatile u16 cmd_status;
pci/hotplug/shpchp.h: volatile u32 intr_loc;
pci/hotplug/shpchp.h: volatile u32 serr_loc;
pci/hotplug/shpchp.h: volatile u32 serr_intr_enable;
pci/hotplug/shpchp.h: volatile u32 slot1;
pcmcia/i82365.c:static volatile u_int irq_hits;
pcmcia/m32r_pcc.c: static volatile u_short dummy_readbuf;
pcmcia/tcic.c:static volatile u_int irq_hits;
举个例子:
volatile const long clock_register; // update by the hardware clock
volatile 就是告诉编译器,不要去试图优化看起多余的读或者写操作。
auto t1{clock_register}; // ...no use of clock_register here ... auto t2{clock_register};
这里clock_register 前面没有volatile去修饰它,编译器就会只读一次clock_register,并且认为t1==t2.
除非是底层直接操作硬件的代码,不要去使用volatile.
讲到这里,应该说,已经讲完了,下面这段话是摘抄自陈正冲《C语言深度解剖》,相信你看完之后,会有更深入的理解
如果,到这里,你还是不能明白,那我就举一个实实在在的例子:
下面代码是取自linux 和uefi
change directory 到driver 目录下面,然后执行 grep
drivers]$ grep -r volatile
我们会发现linux kernel 里面大量用到了volatile
arisc/sba_iommu.c: asm volatile("sync" : : );
parisc/sba_iommu.c: asm volatile("syncdma");
parisc/sba_iommu.c: asm volatile("sync" : : );
parport/parport_ip32.c: /* Note: ctxreg is "volatile" here only because
parport/parport_ip32.c: * "volatile". */
parport/parport_ip32.c: volatile u64 __iomem *ctxreg = (parport_ip32_dma.ctx == 0) ?
parport/parport_mfc3.c:static volatile int dummy; /* for trigger readds */
pci/hotplug/shpchp.h: volatile u32 base_offset;
pci/hotplug/shpchp.h: volatile u32 slot_avail1;
pci/hotplug/shpchp.h: volatile u32 slot_avail2;
pci/hotplug/shpchp.h: volatile u32 slot_config;
pci/hotplug/shpchp.h: volatile u16 sec_bus_config;
pci/hotplug/shpchp.h: volatile u8 msi_ctrl;
pci/hotplug/shpchp.h: volatile u8 prog_interface;
pci/hotplug/shpchp.h: volatile u16 cmd;
pci/hotplug/shpchp.h: volatile u16 cmd_status;
pci/hotplug/shpchp.h: volatile u32 intr_loc;
pci/hotplug/shpchp.h: volatile u32 serr_loc;
pci/hotplug/shpchp.h: volatile u32 serr_intr_enable;
pci/hotplug/shpchp.h: volatile u32 slot1;
pcmcia/i82365.c:static volatile u_int irq_hits;
pcmcia/m32r_pcc.c: static volatile u_short dummy_readbuf;
pcmcia/tcic.c:static volatile u_int irq_hits;
相关文章推荐
- C++ 使用模板实现单例模式
- c/c++/boost字符串的学习
- 初学C语言连载
- C++11实现模板手柄:委托构造函数、defaultkeyword分析
- 【C++知识汇总】运营商 & 运算符重载
- C++类成员的访问控制
- 算法基础——判断一个字符串至多添加一个字符之后是否回文
- C/C++、Java、Python谁是编译型语言,谁是解释型语言?
- c++编译中出现‘vtable for ***未定义的引用解决办法
- C++11中的lambda表达式
- C语言算法训练1
- C++ 笔试题
- CPP-Calling constructors(调用构造函数)
- C++多线程编程
- CPP-Constructors
- C语言中堆和栈的区别
- 黑马程序员---C语言 内存分区
- 【编程题】-C++实现:判断字符串在末尾加一个字符,能否构成回文串
- 黑马程序员 ----C语言 结构体
- 【编程题】-C++实现:不同楼层同时丢球,求小球所经过的总距离