草庐IT

non-volatile

全部标签

c++ - 我应该使用 atomic 还是 volatile 作为指针?

有两个线程(t1和t2)固定到两个不同的核心。它们都有一个共享变量,它是指向某个类类型的原始指针。t1只读指针,t2读/写指针。我应该将指针声明为volatile或atomic还是两者兼而有之?当t2更新这个指针时,t1读取旧指针或新指针都可以,但它不应该读取任何中间值,因为它会导致段错误。 最佳答案 volatile可用于告诉编译器不要优化对变量使用的内存的重复访问。显然,如果另一个线程可以更新变量,您将需要它。它被称为“几乎无用”的原因是,在太多情况下,这不足以保证正确的多线程行为,您需要查看内存栅栏和原子原语操作。在某些处理器

c++ - 只读内存映射寄存器在 C 中定义为 `volatile const` 但在 C++ 中仅定义为 `volatile`

在使用AtmelSAM3X8E处理嵌入式系统项目时,我注意到某些CMSIS头文件中有以下代码。#ifndef__cplusplustypedefvolatileconstuint32_tRoReg;/**为什么C++的typedef不包含const?我在某处看到有人提到C++不会在运行时内存中存储整数const变量,如果为真,则意味着const需要被删除,因为微Controller寄存器是如何映射内存的,但我可以'似乎没有找到任何其他说明C++可以做到这一点的内容(尽管我的搜索确实非常简短)。没有太多的C++经验,我还认为可能是C++不允许const结构成员,因为这些typedef主要

c++ - 为什么参数修饰符(即 'const' 或 'volatile' )不被视为函数类型或签名的一部分?

请注意,以下两个函数具有相同的类型和签名:voidfoo1(intt){}//foo1hastype'void(*)(int)',andsignature'(*)(int)'voidfoo2(constintt){}//Alsotype'void(*)(int)',signature'(*)(int)'(const不是函数类型或函数签名的一部分)。同样,返回类型上的修饰符(const或volatile)不会影响函数类型或函数签名。但是,在函数定义本身(未显示)中,命名变量t确实在foo2中保持const资格。有许多StackOverflow问题在讨论为什么函数的返回类型不被视为函数签名

c++ - 编译错误 : base operand of ‘->’ has non-pointer type ‘Token’

我在尝试编译我的C++代码时遇到标题中提到的错误。我无法理解我在这里做错了什么。编译器在我执行booloperator==(Token)函数时出现问题。我认为这是使运算符(operator)重载的方法。关于为什么编译器不喜欢我提到的任何线索this->terminal还是this->lexeme?classToken{public:tokenTypeterminal;std::stringlexeme;Token*next;Token();booloperator==(Token&t);private:intlexemelength,line,column;};boolToken::o

c++ - 在这里删除 c++ volatile 是否安全?

在这里从m_flag的定义中删除volatile是否安全?如果m_flag不是易变的,什么会阻止编译器优化这个循环的条件:while(!m_flag)m_cv.wait(lock);?标准(C++11之后)是否明确规定在这种情况下禁止进行此类优化?#include#include#include#includeusingnamespacestd;classfoofoo{volatileboolm_flag;mutexm_mutex;condition_variablem_cv;public:voidDoWork(){m_flag=false;unique_locklock(m_mute

c++ - 为什么摆脱 volatile 是危险的?

在C++中,volatile同样对待const是:将指向volatile数据的指针传递给不需要volatile的函数修饰符触发编译错误。intfoo(int*bar){/*snip*/}intmain(){volatileint*baz;foo(baz);//error:invalidconversionfrom‘volatileint*’to‘int*’}为什么危险?对于const很明显删除它会破坏的修饰符const正确性;但是否存在“volatile正确性”这样的东西?我无法弄清楚将指向volatile数据的指针作为指向非volatile数据的指针传递会如何导致问题。编辑只是为了让

c++ - 使用 volatile 来防止基准测试代码中的编译器优化?

我正在创建一个小程序来测量boost::shared_ptr和boost::intrusive_ptr类型容器之间的性能差异。为了防止编译器优化拷贝,我将变量声明为volatile。循环看起来像这样://TestCopymeasuresthetimerequiredtocreatencopiesofthegivencontainer.//Returnstimeinmilliseconds.templatetime_tTestCopy(constContainer&inContainer,std::size_tn){Poco::Stopwatchstopwatch;stopwatch.s

c++ - 如果我在互斥量之间声明一个变量并返回它,是否需要使用 volatile 关键字?

假设我有以下功能。std::mutexmutex;intgetNumber(){mutex.lock();intsize=someVector.size();mutex.unlock();returnsize;}这是在声明大小时使用volatile关键字的地方吗?如果我不使用volatile,返回值优化或其他东西会破坏这段代码吗?someVector的大小可以从程序拥有的众多线程中的任何一个更改,并且假定只有一个线程(修饰符除外)调用getNumber()。 最佳答案 没有。但请注意,大小可能无法反射(reflect)互斥锁释放后的

c++ - 是否在 C++ 中访问未从函数可观察行为外部访问的 volatile 局部变量?

在C++03中,标准可观察行为(1.9/6)包括读取和写入volatile数据。现在我有了这个代码:intmain(){constvolatileintvalue=0;if(value){}return0;}正式初始化一个volatile变量,然后读取它。VisualC++10发出机器代码,通过将dword压入栈中腾出空间,然后将零写入该栈位置,然后读取该位置。对我来说这没有任何意义-没有其他代码或硬件可能知道局部变量的位置(因为它在自动存储中),因此期望该变量可能已被任何其他方读取/写入是不合理的所以在这种情况下可以消除它。是否允许消除此变量访问?访问一个volatilelocal的

C++ volatile 多线程变量

我正在编写一个C++应用程序。我有一个类变量,多个线程正在写入。在C++中,任何可以在编译器“意识到”它正在被更改的情况下被修改的东西都需要标记为volatile,对吧?因此,如果我的代码是多线程的,并且一个线程可能写入var而另一个线程从中读取,我是否需要标记varvolaltile?[我没有竞争条件,因为我依赖对整数的原子写入]谢谢! 最佳答案 C++还没有任何多线程的规定。在实践中,volatile并没有按照你的意思去做(它是为内存寻址硬件设计的,虽然这两个问题很相似,但它们的不同之处足以使volatile不能做正确的事情——