我在许多引用文献中发现它提到C/C++中的volatile很弱,可能会在多个处理器的并发环境中导致问题,但它(volatile)可以用作C#/Java中不同CPU之间的通信机制。看起来这个关键字在C#/Java中比在C/C++中更严格,但它们之间的区别/影响是什么?这里是C/C++中volatile的引用。WhyisvolatilenotconsideredusefulinmultithreadedCorC++programming? 最佳答案 对于C#/Java,“volatile”告诉编译器一个变量的值绝不能被缓存,因为它的值可
为什么下面的代码无法编译(gcc-5.4.0)?volatileinti{100};intj{200};std::cout我的意思是我看到编译器错误:error:nomatchingfunctionforcallto‘min(volatileint&,int&)’volatile不只是提示编译器,变量可以从程序外部更改吗?std::min(int(i),j);当然有效。但是原创作品不也应该吗? 最佳答案 volatile是一个qualifier就像const一样。这不仅仅是对编译器的提示。std::min期望这两个参数具有完全相同的
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。为了帮助澄清这个问题以便可以重新打开它,visitthehelpcenter.关闭11年前。您能否简要介绍一下这4个关键字的用途和原因?我了解google会告诉您的关于register和volatile的基本知识,但想了解更多(只是一个实用的概述)。外部和显式让我有点困惑,因为尽管做了相当低级的嵌入式系统代码,但我从来没有找到自己必须使用它们的理由。再说一次,我可以用谷歌搜索,但我更喜欢专家提供的快速实用的总结,以便牢记在心。 最佳答案
这个问题在这里已经有了答案:Whydoesstd::coutconvertvolatilepointerstobool?(4个回答)关闭8年前。考虑这个(人工)示例:#include#includeintmain(){volatilechartest[]="abc";std::printf("%s\n",test);std::cout使用GCC编译并运行会得到以下输出:$g++test.cc$./a.outabc1如您所见,printf正确打印字符串,而cout打印1。为什么在这种情况下写入cout会产生1? 最佳答案 operat
我正在阅读AnthonyWilliams的C++concurrencyinactionbook。这个经典的例子有两个线程,一个产生数据,另一个消耗数据,A.W.这段代码写得很清楚:std::vectordata;std::atomicdata_ready(false);voidreader_thread(){while(!data_ready.load()){std::this_thread::sleep(std::milliseconds(1));}std::cout而且我真的不明白为什么这段代码与我使用经典的volatilebool而不是原子的不同。如果有人能在这个问题上打开我的思
C++17的当前标准(我观察到C++11的类似措辞)对于可复制的类型的措辞非常困惑。我首先通过以下代码(GCC5.3.0)偶然发现了这个问题:classTrivialClass{};std::is_trivially_copyable::value;//0std::is_trivially_copyable::value;//1??让困惑变得更糟,我试图查看std::is_trivial对此事的看法,但结果更加困惑。classTrivialClass{};std::is_trivial::value;//1??std::is_trivial::value;//1很困惑,我检查了最新的C
如果我有如下C++方法声明:classA{public:doublegetPrice()volatile;};volatile在这里代表什么?它可以用来做什么?您可能对this感兴趣AndreiAlexandrescu的Dobbs博士文章。我是:)编辑:那篇文章是不久前写的,现在看来社区已经继续前进了。HerbSutter有话要说this.谢谢伊恩(和赫伯!)mlimber指出Andrei有一篇后续文章here他继续提倡使用volatile正确性作为检测支持类似POSIX互斥体的系统上的竞争条件的宝贵工具。 最佳答案 您可能熟悉co
我想检查我的变量的地址volatileintclock;cout但它总是说x在地址1。我做错了什么吗?? 最佳答案 iostreams会将大多数指针转换为void*以供显示-但volatile指针不存在转换。因此,C++回退到对bool的隐式强制转换。如果要打印地址,请显式转换为void*:std::cout 关于c++-为什么这个volatile变量的地址总是为1?,我们在StackOverflow上找到一个类似的问题: https://stackoverf
我正在查看以下代码:inlinevoid*interlocked_read_acquire(void*volatile*x);我想知道为什么不只是一个volatilevoid*作为参数。一般而言,volatile*的语义或定义是什么?我还假设您可以将volatile*限定符与除void之外的任何其他类型一起使用。对吗? 最佳答案 使用cdecl或clockwisespiralrule破译C风格的声明:void*volatile*x将x声明为指向void的volatile指针不同于:volatilevoid*x将x声明为指向volat
volatile关键字在C中用于防止编译器对变量执行某些优化,以及其他细微的更改。例如;volatileintmy_int=0;创建一个整数。在某些情况下,它可能会阻止以下优化:while(my_int==0);//Loopuntilmy_int!=0优化到:while(1);//Loopinfinity.这对于包括嵌入式系统中经常遇到的情况很有用,例如可能通过中断函数调用对变量进行修改的情况。还有许多其他例子说明这种技术是有用的。my_int可以是一个被这样的函数修改的标志。(这只是一个玩具模型。)但是,考虑函数修改的数据是数组的情况。数据可以由指针指向。unsignedchar*m