草庐IT

volatile

全部标签

c++ - 为什么 volatile 局部变量的优化与 volatile 参数不同,为什么优化器会从后者生成无操作循环?

背景这是受到这个问题/答案以及随后在评论中的讨论的启发:Isthedefinitionof“volatile”thisvolatile,orisGCChavingsomestandardcompliancyproblems?.根据其他人和我对应该发生的事情的解释,如评论中所述,我已将其提交给GCCBugzilla:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71793仍然欢迎其他相关回复。此外,该线程已经引起了这个问题:Doesaccessingadeclarednon-volatileobjectthroughavolatilerefer

c++ - 优化 volatile 堆栈变量的存储/构造是否合法?

我注意到在某些情况下,clang和gcc优化了在堆栈上声明的volatilestruct的构造或赋值。例如下面的代码:structnonvol2{uint32_ta,b;};voidvolatile_struct2(){volatilenonvol2temp={1,2};}Compiles在clang上:volatile_struct2():#@volatile_struct2()ret另一方面,gcc不会删除存储,尽管它确实将两个隐含存储优化为一个存储:volatile_struct2():movabsrax,8589934593movQWORDPTR[rsp-8],raxret奇怪

c++ - 是否有任何理由在 C 中声明 "volatile const"而在 C++ 中仅声明 "volatile"?

我在我的项目中使用的头文件具有以下定义:#ifdef__cplusplusextern"C"{#endif#ifdef__cplusplus#define__Ivolatile/*!__I在另一个头文件中使用如下:typedefstruct{//moremembersbefore__Iuint32_tCR;/*!我的问题是为什么__I在C中而不是在C++中成为常量?您仍然可以修改CR指向的值,因为您有地址,但我只是好奇为什么__I的定义不同。对于任何对它的用途或来源感兴趣的人,__I定义来自IAREmbeddedWorkbenchARMforCortex-M4,结构来自德州仪器LM4F

c++ - 丢弃 volatile 安全吗?

大多数时候,我都是这样做的。classa{public:~a(){i=100;//OKdelete(int*)j;//Compilerhappy.But,isitsafe?//Thefollowingcodewillleadcompilationerror:deletej;}private:volatileinti;volatileint*j;};intmain(){aaa;}然而,我在这里看到一篇文章:https://www.securecoding.cert.org/confluence/display/seccode/EXP32-C.+Do+not+access+a+volati

c++ - 严格指针别名 : is access through a 'volatile' pointer/reference a solution?

在aspecificproblem之后,一个self回答和评论,我想了解它是否是一个合适的解决方案、变通方法/破解或完全错误。具体来说,我重写了代码:Tx=...;if(*reinterpret_cast(&x)==0)...作为:Tx=...;if(*reinterpret_cast(&x)==0)...带有指向指针的volatile限定符。让我们假设在我的情况下将T视为int是有意义的。这种通过volatile引用访问是否解决了指针别名问题?作为引用,来自规范:[Note:volatileisahinttotheimplementationtoavoidaggressiveopti

C++ : Why cant static functions be declared as const or volatile or const volatile

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:C++-Whystaticmemberfunctioncan’tbecreatedwith‘const’qualifier想知道为什么静态成员函数不能声明为const或volatile或constvolatile的原因?#includeclassTest{staticvoidfun()const{//compilererrorreturn;}};

c++ - 具有类型 'const CompareVPtrs' 的表达式将丢失一些 const-volatile 限定符以便调用

我正在用C++实现十五个益智控制台游戏,引发了以下错误Error4errorC3848:expressionhavingtype'constCompareVPtrs'wouldlosesomeconst-volatilequalifiersinordertocall'boolCompareVPtrs::operator()(Vertex*,Vertex*)'c:\programfiles\microsoftvisualstudio11.0\vc\include\xfunctional3241puzzle15这是我的结构structCompareVPtrs:publicbinary_fu

c++ - volatile 数据成员是否可以轻松复制?

写作时thisanswer我意识到我对自己的结论没有信心,因为我通常会在点击发布您的答案之前确保这一点。对于volatile数据成员的平凡可复制性要么是实现定义的,要么是完全不允许的论点,我可以找到一些相当有说服力的引文:https://groups.google.com/forum/?fromgroups=#!topic/comp.std.c++/5cWxmw71ktIhttp://gcc.gnu.org/bugzilla/show_bug.cgi?id=48118http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#

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