您的位置:首页 > 编程语言 > C语言/C++

C/C++ 中volatile用法

2015-09-20 09:46 302 查看
当用volatile去修饰一个变量的时候,表明这个变量很可能被其他地方修改

举个例子:

 

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: