草庐IT

volatile-qualifier

全部标签

C++ volatile 对象,非 volatile 成员

在问题中:假设我有一小段这样的代码:#includeusingnamespacestd;structfoo{inta;foo():a(12){};};intmain(){volatilefoox;return0;}用g++-g-O2编译事实证明,x初始化被优化掉了。但是那个:#includeusingnamespacestd;structfoo{volatileinta;foo():a(12){};};intmain(){volatilefoox;return0;}调用构造函数。如果我尝试在代码中使用变量(即cout),两种情况下的汇编输出是等效的。我是否正确理解以下内容:在第一种情况

c++ - volatile 未按预期工作

考虑这段代码:structA{volatileintx;A():x(12){}};Afoo(){Aret;//Dostuffreturnret;}intmain(){Aa;a.x=13;a=foo();}使用g++-std=c++14-pedantic-O3我得到了这个程序集:foo():movl$12,%eaxretmain:xorl%eax,%eaxret根据我的估计,变量x应该至少被写入三次(可能是四次),但它甚至没有被写入一次(函数foo不是甚至打电话!)更糟糕的是,当您将inline关键字添加到foo时,结果如下:main:xorl%eax,%eaxret我认为volatil

c++ - volatile 限定符是否取消了此内存的缓存?

在本文中: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无法工作的缓存一致性:网

c++ - 如果我声明一个实例变量为volatile,这个类的对象会不会是volatile?

喜欢:classA{volatileinti;};Aa;我的问题是整个a成为cv合格吗?可能是一个幼稚的问题。 最佳答案 不,所有a都不会volatile。正如您可以拥有一个const的类的字段,而无需该类的每个实例都是const,您可以拥有不是const的volatile字段使整个类实例volatile。 关于c++-如果我声明一个实例变量为volatile,这个类的对象会不会是volatile?,我们在StackOverflow上找到一个类似的问题: ht

c++ - volatile 复制构造函数有什么用?

您能举一个简单的或真实的例子来演示volatile复制构造函数的用法吗?我只是想不出一个。 最佳答案 正如@Nawaz已经指出的那样:Whenyouhavevolatileobjects,youneedvolatilecopy-ctor.Sothequestionboilsdowntothis:whendoyouneedvolatileobjects?使用volatile关键字的主要原因通常是禁用优化。那就是如果你有这样的东西:boolflag=false;if(!flag){}编译器会发现标志无法更改,因此无需每次都检查标志-所以

c++ - 错误 : Qualifiers dropped in binding reference of type x to initializer of type y

为什么下面会抛出这个错误:IntelliSense:qualifiersdroppedinbindingreferenceoftype"string&"toinitializeroftype"conststring".hclassA{public:wstring&GetTitle()const;private:wstringtitle;};.cppwstring&GetTitle()const{returnthis->title;}如果我删除const词,它就会停止提示,但我从未对变量进行任何更改? 最佳答案 通过返回对类成员的非c

c++ - 指针数组,如 (*(volatile unsigned long *)0x40004000)

我很难弄清楚如何解决以下问题。我在一个内存很少的嵌入式系统上,想尽量减少内存使用。指针总是让我感到困惑,而且将永远如此。我有一大堆寄存器地址的定义:#defineGPIO_PORTA_BASE(*((volatileunsignedlong*)0x40004000))#defineGPIO_PORTB_BASE(*((volatileunsignedlong*)0x40005000))//etc..这些寄存器可直接访问。例如:GPIO_PORT_BASE&=0x01;我需要的是一个包含上述寄存器的数组,以便我可以轻松地将它们映射到索引。例如:not_sure_what_to_decla

c++ - 互斥体的存在是否有助于摆脱 volatile 关键字?

我有一个多R/W锁类,它保留读、写和挂起的读、挂起的写计数器。互斥量保护它们不受多个线程的影响。我的问题是,我们是否仍需要将计数器声明为易变的,以便编译器在进行优化时不会搞砸。或者编译器是否考虑到计数器由互斥量保护。我知道互斥锁是一种用于同步的运行时机制,“volatile”关键字是编译时指示编译器在进行优化时做正确的事情。问候,-周杰伦。 最佳答案 这里有2个基本不相关的项目,总是混淆。不稳定线程、锁、内存屏障等volatile用于告诉编译器生成代码以从内存中读取变量,而不是从寄存器中读取。并且不要重新排序代码。一般来说,不要优化

c++ - 使用 ref-qualifiers 的重载决议

在使用ref-qualified函数重载时,我从GCC(4.8.1)和Clang(2.9和主干)得到了不同的结果。考虑以下代码:#include#includestructfoo{int&bar()&{std::coutClang编译它并输出"constrvalue",而GCC认为这是一个含糊不清的调用,两个const限定函数都成为最可行的候选人。如果我提供所有4个重载,那么两个编译器都会输出"non-constrvalue"。我想知道哪个编译器-如果有的话-正在做正确的事情,以及相关的标准部分是什么。注意:这一点真正重要的原因是实际代码将两个const限定函数都声明为constexp

c++ - 可以重新排序对 volatiles 的访问吗?

考虑以下对volatile内存的写入序列,我从DavidChisnall'sarticleatInformIT中获取,“理解C11和C++11原子”:volatileinta=1;volatileintb=2;a=3;我对C++98的理解是,根据C++981.9,这些操作不能重新排序:conformingimplementationsarerequiredtoemulate(only)theobservablebehavioroftheabstractmachineasexplainedbelow...Theobservablebehavioroftheabstractmachinei