草庐IT

volatile

全部标签

c++ - 当编译器看不到可以完成转换的可能类型时,是否允许编译器优化 volatile 指针的 dynamic_cast?

看看这个小片段:structA{virtual~A(){}};structB{};boolfn(){A*volatilea=newA;returndynamic_cast(a);}是否允许编译器完全删除dynamic_cast,并将dynamic_cast转换为简单的nullptr;?这个问题的原因是这个answer.注意事项:假定volatile意味着编译器不能假定任何有关a的信息,因为它是易变的。这是一个question为什么。dynamic_cast可能不允许被删除的事实是程序中某处可能有一个类型,它派生自A和B。 最佳答案

c++ - 内存映射文件和指向易失对象的指针

我对C和C++中volatile语义的理解是它将内存访问变成了(observable)sideeffects.每当读取或写入内存映射文件(或共享内存)时,我都希望指针是volatile限定的,以表明这实际上是I/O。(JohnRegehr在volatile的语义上写了一篇非常好的article)。此外,我希望使用像memcpy()这样的函数来访问共享内存是不正确的,因为签名表明volatile限定被丢弃,并且内存访问不被视为我/哦。在我看来,这是一个支持std::copy()的论点,其中volatile限定符不会被丢弃,内存访问被正确地视为I/O。但是,我使用指向volatile对象的

c++ - 标准在哪里定义 volatile 变量可以更改?

标准在哪里定义volatile变量可以改变未被发现?我找到了两个关于volatile的规范文本:intro.execution/7:Readinganobjectdesignatedbyavolatileglvalue([basic.lval]),modifyinganobject,callingalibraryI/Ofunction,orcallingafunctionthatdoesanyofthoseoperationsareallsideeffects,whicharechangesinthestateoftheexecutionenvironment.Evaluationof

c++ - 在 C/C++ 中,是否保证 volatile 变量在线程之间具有最终一致的语义?

是否有任何普遍遵循的标准(ISOC或C++,或任何POSIX/SUS规范)一个变量(也许标记为volatile),不受互斥量保护,正在被访问由多个线程将变得最终一致,如果它是分配给?举个具体的例子,考虑两个线程共享一个变量v,初始值为零。线程1:v=1线程2:同时(v==0)产量();是否保证线程2最终会终止?或者可以吗可以想象永远旋转,因为缓存一致性永远不会启动并使分配在线程2的缓存中可见?我知道C和C++标准(在C++0x之前)不在所有关于线程或并发。但我很好奇C++0x是否内存模型或pthreads或其他任何东西都可以保证这一点。(显然,这确实适用于32位x86的Windows;

c++ - 当一个成员函数是 volatile 时,这意味着什么?

这个问题在这里已经有了答案:WhatisthepurposeofavolatilememberfunctioninC++?(2个答案)关闭9年前。我通常看到const说明符用于指示const成员函数。但是,当使用volatile关键字时,这意味着什么?voidf()volatile{}这对我来说编译得很好,但我不明白这是干什么用的。我在搜索中找不到任何关于此的信息,因此非常感谢您的帮助。更新:为了清楚起见,我知道volatile的用途。我只是不知道在这种情况下这意味着什么。

c++ - 为什么 "volatileQualifiedExpr + volatileQualifiedExpr"在 C 中不一定是 UB 而在 C++ 中是?

当我今天阅读C标准时,它提到了副作用Accessingavolatileobject,modifyinganobject,modifyingafile,orcallingafunctionthatdoesanyofthoseoperationsareallsideeffectsC++标准说Accessinganobjectdesignatedbyavolatileglvalue(3.10),modifyinganobject,callingalibraryI/Ofunction,orcallingafunctionthatdoesanyofthoseoperationsareallsi

c++ - 转发成员函数的 cv-ref-qualifier

如果(成员)函数模板f(T&)没有其他重载(例如f(volatileT&&)或templatef(T&&);),然后T&&是所谓的转发引用,T是U,或U&对于某些cv-qualified类型U.但是对于成员函数的cv-ref-qualifiers则没有这样的规则。在structS{voidf()&&{;}};一个S::f()始终具有右值引用限定符。在通用代码中,避免定义某些成员函数的4(甚至8,如果我们还考虑volatile限定符)重载将非常有用,以防所有成员函数都做同样的事情。以这种方式出现的另一个问题是,不可能定义*this的有效cv-ref-qualifier在某种意义上。以下代

c++ - 所有全局变量都应该是 volatile 限定的吗?

在此示例中,正确性是否需要将global_value声明为volatile?intglobal_value=0;voidfoo(){++global_value;}voidbar(){some_function(++global_value);foo();some_function(++global_value);}我的理解是volatile是“打算”用于pointerstomappedmemoryandvariableswhichcanbemodifiedbysignals的(强调不是线程安全)但很容易想象bar可能会编译成这样的东西:pushEAXmovEAX,global_val

c++ - const_cast<> 在 volatile 上的目的是什么?

我看到可以这样做,但我不明白其中的兴趣。 最佳答案 const和volatile听起来它们在变量上指的是相同的想法,但实际上并非如此。const变量不能被当前代码改变。volatile变量可能会被当前代码之外的某些外部实体更改。有可能有一个constvolatile变量——尤其是像内存映射寄存器这样的东西——在你的程序无法预测的时候被计算机改变,但你的代码不允许直接改变.您可以使用const_cast向变量添加或删除const或volatile(“cv-qualification”)。

c++ - 此多线程 C++ 代码中是否需要 'volatile'?

我用C++编写了一个Windows程序,它有时使用两个线程:一个后台线程用于执行耗时的工作;和另一个用于管理图形界面的线程。这样程序仍然响应用户,这是能够中止某个操作所必需的。线程通过共享的bool变量进行通信,当GUI线程向工作线程发出信号以中止时,该变量设置为true。以下是实现此行为的代码(我已删除不相关的部分):GUI线程执行的代码classProgressBarDialog:protectedDialog{/***Thispointstothevariablewhichtheworkerthreadreadstocheckifit*shouldabortornot.*/boo