在本文中:http://www.drdobbs.com/parallel/volatile-vs-volatile/212701484?pgno=2说,我们不能对volatile做任何优化,即使是(where:volatileint&v=*(address);):v=1;//C:writetovlocal=v;//D:readfromv无法对此进行优化:v=1;//C:writetovlocal=1;//D:readfromv//butitcanbedoneforstd::atomic这是不可能完成的,因为在第1行和第2行之间v值可能会被硬件设备更改(不是CPU无法工作的缓存一致性:网
喜欢:classA{volatileinti;};Aa;我的问题是整个a成为cv合格吗?可能是一个幼稚的问题。 最佳答案 不,所有a都不会volatile。正如您可以拥有一个const的类的字段,而无需该类的每个实例都是const,您可以拥有不是const的volatile字段使整个类实例volatile。 关于c++-如果我声明一个实例变量为volatile,这个类的对象会不会是volatile?,我们在StackOverflow上找到一个类似的问题: ht
您能举一个简单的或真实的例子来演示volatile复制构造函数的用法吗?我只是想不出一个。 最佳答案 正如@Nawaz已经指出的那样:Whenyouhavevolatileobjects,youneedvolatilecopy-ctor.Sothequestionboilsdowntothis:whendoyouneedvolatileobjects?使用volatile关键字的主要原因通常是禁用优化。那就是如果你有这样的东西:boolflag=false;if(!flag){}编译器会发现标志无法更改,因此无需每次都检查标志-所以
我很难弄清楚如何解决以下问题。我在一个内存很少的嵌入式系统上,想尽量减少内存使用。指针总是让我感到困惑,而且将永远如此。我有一大堆寄存器地址的定义:#defineGPIO_PORTA_BASE(*((volatileunsignedlong*)0x40004000))#defineGPIO_PORTB_BASE(*((volatileunsignedlong*)0x40005000))//etc..这些寄存器可直接访问。例如:GPIO_PORT_BASE&=0x01;我需要的是一个包含上述寄存器的数组,以便我可以轻松地将它们映射到索引。例如:not_sure_what_to_decla
我有一个多R/W锁类,它保留读、写和挂起的读、挂起的写计数器。互斥量保护它们不受多个线程的影响。我的问题是,我们是否仍需要将计数器声明为易变的,以便编译器在进行优化时不会搞砸。或者编译器是否考虑到计数器由互斥量保护。我知道互斥锁是一种用于同步的运行时机制,“volatile”关键字是编译时指示编译器在进行优化时做正确的事情。问候,-周杰伦。 最佳答案 这里有2个基本不相关的项目,总是混淆。不稳定线程、锁、内存屏障等volatile用于告诉编译器生成代码以从内存中读取变量,而不是从寄存器中读取。并且不要重新排序代码。一般来说,不要优化
考虑以下对volatile内存的写入序列,我从DavidChisnall'sarticleatInformIT中获取,“理解C11和C++11原子”:volatileinta=1;volatileintb=2;a=3;我对C++98的理解是,根据C++981.9,这些操作不能重新排序:conformingimplementationsarerequiredtoemulate(only)theobservablebehavioroftheabstractmachineasexplainedbelow...Theobservablebehavioroftheabstractmachinei
我有一个编译错误:errorC3848:expressionhavingtype'constunicode::endian_swap'wouldlosesomeconst-volatilequalifiersinordertocall'unsignedlongunicode::endian_swap::operator()(T&)'此错误的描述,Here,并没有真正解释发生了什么。我无法在较小的示例中重现错误,但我可以展示我的类的基本布局。templatestructendian_swap{endian_swap(void){}Toperator()(T&_val)const{retu
我最近发现在C++多线程代码中使用volatile关键字很奇怪。为了抽象编程模式,我们假设有一个控制对象被一个生产者和多个消费者线程访问:classcontrol_t{pthread_mutex_tcontrol_lock;pthread_cond_twake_cond;boolthere_is_work_todo;control_tvolatile*vthis(){returnthis;}}消费者线程执行以下操作(c是指向控制对象的非volatile指针):...pthread_mutex_lock(c->control_lock)while(!c->vthis()->there_i
我有一个A类,我重载了它的operator=。但是,我需要做这样的事情:volatileAx;Ay;x=y;编译时出现错误error:nooperator"="matchestheseoperandsoperandtypesare:volatileA=A如果我删除了volatile,它就是可编译的。有没有办法在不删除“volatile”(并且仍然保持volatile的行为)的情况下编译它?基本上这是一个CUDA程序,其中“x”是一个共享内存(所有线程都可以访问和修改它的值)。我希望它是“易变的”以避免编译器优化并重新使用该值而不是访问内存地址。关于这个问题的更多信息:一开始A只是一个原
此站点上有几个问题询问是否可以使用volatile变量进行原子/多线程访问:参见here,here,orhere例如。现在,符合C(++)标准的答案显然是否。但是,在Windows和VisualC++编译器上,情况似乎不太清楚。我最近answered并引用了officialMSDNdocs在volatile上MicrosoftSpecificObjectsdeclaredasvolatileare(...)Awritetoavolatileobject(volatilewrite)hasReleasesemantics;areferencetoaglobalorstaticobject