草庐IT

non-volatile

全部标签

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

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

c++ - 重载运算符 : const vs non-const return type : any difference of performance?

如果我们去维基百科article关于C++运算符,我们有一个例子:Addition:a+b->TT::operator+(constT&b)const;因此运算符返回类型为T的非常量。如果我们看这个guideline作者说返回类型应该是const以避免以下语法:(a+b)=c现在假设我不介意这种语法,并考虑a和b是大数组。从“纯”性能的角度来看,返回类型中缺少const关键字是否会阻止编译器的优化(g++和带有-O3的英特尔icpc)?如果答案是"is",为什么? 最佳答案 这是一个有趣的问题。在C++03中,没有更好的机会使用这两

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++ - 处理 "depends on non-NOTIFYable properties"警告

我有一个暴露给QML的C++对象,它具有“某种”只读属性,除了该属性仍然需要从QML设置,所以它定义了一个WRITE方法,但是除了初始的ma​​ndatory设置它永远不会改变,所以我觉得NOTIFY是多余的,因为它在使用时已经设置了该值,并且它永远不会改变。但是,QML不同意我的感受,并且无论如何它都会发出“表达式取决于不可通知​​的属性”警告。由于使用属性实例化对象的方式是设置该值的唯一适用方式,因此不可能使用可调用的setter,因为这样会要求对象已经“完成”并且没有它就无法真正完成那个值。因此需要属性机制和WRITE方法,不幸的是,这导致Qt相信属性会改变。我尝试将该属性设置为

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

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

c++ - 丢失 const volatile 限定词

我有一个编译错误:errorC3848:expressionhavingtype'constunicode::endian_swap'wouldlosesomeconst-volatilequalifiersinordertocall'unsignedlongunicode::endian_swap::operator()(T&)'此错误的描述,Here,并没有真正解释发生了什么。我无法在较小的示例中重现错误,但我可以展示我的类的基本布局。templatestructendian_swap{endian_swap(void){}Toperator()(T&_val)const{retu

c++ - 使用指向 "this"的 volatile 指针的此模式的目的是什么?

我最近发现在C++多线程代码中使用volatile关键字很奇怪。为了抽象编程模式,我们假设有一个控制对象被一个生产者和多个消费者线程访问:classcontrol_t{pthread_mutex_tcontrol_lock;pthread_cond_twake_cond;boolthere_is_work_todo;control_tvolatile*vthis(){returnthis;}}消费者线程执行以下操作(c是指向控制对象的非volatile指针):...pthread_mutex_lock(c->control_lock)while(!c->vthis()->there_i

c++ - SIMD/SSE : How to check that all vector elements are non-zero

我需要检查所有vector元素是否非零。到目前为止,我找到了以下解决方案。有一个更好的方法吗?我在Linux/x86_64上使用gcc4.8.2,指令高达SSE4.2。typedefcharChrVect__attribute__((vector_size(16),aligned(16)));inlinebooltestNonzero(ChrVectvect){constChrVectvzero={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};return(0==(__int128_t)(vzero==vect));}更新:上面的代码被编译为以下汇编代码(当编译为非

CUDA 应用程序的 C++ volatile 和运算符重载

我有一个A类,我重载了它的operator=。但是,我需要做这样的事情:volatileAx;Ay;x=y;编译时出现错误error:nooperator"="matchestheseoperandsoperandtypesare:volatileA=A如果我删除了volatile,它就是可编译的。有没有办法在不删除“volatile”(并且仍然保持volatile的行为)的情况下编译它?基本上这是一个CUDA程序,其中“x”是一个共享内存(所有线程都可以访问和修改它的值)。我希望它是“易变的”以避免编译器优化并重新使用该值而不是访问内存地址。关于这个问题的更多信息:一开始A只是一个原