草庐IT

non-volatile

全部标签

c++ - 模板函数中的 volatile 类型推导有什么问题?

我有一个模板函数:templateinlinevoidAcquire_Store(volatileT*ptr,Tvalue){//...}当我尝试像这样调用它时:volatileNode*node;Acquire_Store(&node,static_cast(nullptr));g++和clang++编译器都是这样说的:deducedconflictingtypesforparameter'T'('volatileList::Node*'vs.'List::Node*')调用此模板函数的正确方法是什么?更新。现在我不确定node的类型-也许,我应该将其更改为Node*volatile

c++ - Visual C++ x86 上的 volatile 变量和原子操作

普通加载在x86上具有获取语义,普通存储具有释放语义,但是编译器仍然可以重新排序指令。虽然栅栏和锁定指令(锁定xchg、锁定cmpxchg)防止硬件和编译器重新排序,但仍然需要普通加载和存储来保护编译器屏障。VisualC++提供了_ReadWriterBarrier()函数,它可以防止编译器重新排序,C++也出于同样的原因提供了volatile关键字。我写下所有这些信息只是为了确保我做对了一切。所以上面写的都是真的,是否有任何理由标记为将在受_ReadWriteBarrier()保护的函数中使用的volatile变量?例如:intload(int&var){_ReadWriteBar

c++ - 嵌入式 C++11 代码——我需要 volatile 吗?

带有CortexM3MCU(STM32F1)的嵌入式设备。它有嵌入式闪存(64K)。MCU固件可以在运行时重新编程闪存扇区;这是由闪存Controller(FMC)寄存器完成的(因此它不像a=b那样容易)。FMC获取缓冲区指针并将数据烧录到某个闪存扇区。我想将最后一个闪存扇区用于设备配置参数。参数存储在带有数组的打包结构中,并包含一些自定义类。参数可以在运行时更改(复制到RAM,更改并使用FMC烧回闪存)。所以有一些问题:参数结构的状态(按位)由FMC硬件更改。C++编译器不知道它是否被更改。这是否意味着我应该将所有结构成员声明为volatile?我想是的。Struct应该在编译时静态

c++ - 添加 Boost 使调试构建依赖于 "non-D"MSVC 运行时 DLL

我有一个烦人的问题,我可能能够以某种方式规避它,但另一方面,我更愿意了解它并了解到底发生了什么,因为看起来这些东西真的会留下来。故事是这样的:我有一个简单的OpenGL应用程序,它运行良好:在编译、链接或运行它时从来都不是主要问题。现在我决定尝试将一些更密集的计算移到工作线程中,以便可能使GUI响应更快——当然是使用Boost.Thread。简而言之,如果我在.cpp文件的开头添加以下片段:#includevoiddummyThreadFun(){while(1);}boost::threadp(dummyThreadFun);,然后我在尝试启动调试版本时开始收到“此应用程序无法启动,

带有函数访问的全局共享变量的 C++ volatile 关键字

我有一个多线程C++应用程序。现在我知道对于全局共享变量,在某些情况下您应该在检查变量状态时使用volatile,否则编译器可能会假设变量的值永远不会改变(在该线程中)。但是,如果我没有检查变量的状态,而是调用了一个返回变量值的方法,会怎样呢?例如:staticintnum=0;...voidfoo(){while(getNum()==0){//dosomething(ornothing)}}我还需要将num设置为可变变量吗?或者编译器是否认识到,因为我正在使用一种方法来访问该变量num,所以它不会缓存结果?有人有什么想法吗?提前致谢~朱利安编辑:在我的while循环中,我删除了sle

c++ - 这里需要 volatile 吗?

在Johannes的宝贵回答后编辑并完善了我的问题boolb=true;volatileboolvb=true;voidf1(){}voidf2(){b=false;}void(*volatilepf)()=&f1;//avolatilepointertofunctionintmain(){//differentthreadsstarthere,someofwhichmaychangepfwhile(b&&vb){pf();}}那么,让我们暂时忘记同步。问题是b是否必须声明为volatile。我已经阅读了标准并且知道易变语义的正式定义(我什至几乎理解它们,这个词几乎是关键)。但是,让我

C++, Linux : error: conversion from ‘boost::unique_future<void>’ to non-scalar type ‘boost::shared_future<void>’ requested. 如何绕过它?

我尝试使用boostthreadfutures.所以如图here我们可以得到sharedfuture来自packagedtask.所以我在linux上尝试这样的功能:templatevoidpool_item(boost::shared_ptr>pt){boost::shared_futurefi=pt->get_future();//error//...但调用它时出错:../../src/cf-util/thread_pool.h:Inmemberfunction‘voidthread_pool::pool_item(boost::shared_ptr>)[withtask_retu

c++ - 从 volatile 变量中获取值的符合 C++03 的方法是什么?

根据这个defectreportC++03标准不保证在以下代码中:volatileintx;voidf(){x;}从中读取变量。那么我该如何编写只读取volatile变量值并丢弃结果的代码(为了读取而读取)? 最佳答案 inti=x;应该可以。此代码绝对需要读取volatile变量,并且不允许优化器优化读取。但是由于变量i未被使用,优化器可以避免存储读取值所涉及的任何额外工作。您可能还需要这样的东西来避免编译器警告:(void)i; 关于c++-从volatile变量中获取值的符合C++

c++ - 为什么可以相对于非 volatile 访问对这种 volatile 访问进行重新排序?

下面的代码示例来自Chineseblog其中引入了volatile的效果。左边是C代码;另一个是生成的汇编代码。//cordering.cgcc-O2-S-masm=intelcordering.cintA;volatileintB;voidfoo()moveax,DWORDPTRB[rip]{movDWORDPTRB[rip],0A=B+1;addeax,1B=0;movDWORDPTRA[rip],eax}ret正如我们在汇编代码中看到的那样,A的副作用位于B的副作用之后,即使B是volatile合格的。然而,cppreference.comsays:[W]ithinasingle

C++ 错误 : Conversion to Non-Scalar Type

这个问题不太可能帮助任何future的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visitthehelpcenter.关闭10年前。我似乎在下面的代码段中遇到了一个特殊的错误(忽略多余的头文件和空白的主函数,我只是想将这个问题隔离到一个可编译的.cpp文件中以便在这里发布)。它说从“[我定义的某些类型]”到非标量类型“[我定义的某些类型]”的错误转换。这个特定示例中的代码应该将一组字符串列表作为一个输入参数(命名输入),并将对字符串列表的引用作为另一个(命名输出)并计算最长的公共(p