我知道volatile不会在int上强制执行原子性,但如果您访问单个字节,它会这样做吗?如果我没记错的话,语义要求写入和读取始终来自内存。或者换句话说:CPU是否总是以原子方式读取和写入字节? 最佳答案 该标准不仅没有说明原子性,而且您甚至可能问错了问题。CPU通常以原子方式读取和写入单个字节。问题来了,因为当您有多个内核时,并非所有内核都会将字节视为已同时写入。事实上,在所有内核都看到写入之前,可能需要相当长的时间(用CPU来说,数千或数百万条指令(也就是微秒或毫秒))。因此,您需要有点名不副实的C++0x原子操作。他们使用CPU
我知道volatile不会在int上强制执行原子性,但如果您访问单个字节,它会这样做吗?如果我没记错的话,语义要求写入和读取始终来自内存。或者换句话说:CPU是否总是以原子方式读取和写入字节? 最佳答案 该标准不仅没有说明原子性,而且您甚至可能问错了问题。CPU通常以原子方式读取和写入单个字节。问题来了,因为当您有多个内核时,并非所有内核都会将字节视为已同时写入。事实上,在所有内核都看到写入之前,可能需要相当长的时间(用CPU来说,数千或数百万条指令(也就是微秒或毫秒))。因此,您需要有点名不副实的C++0x原子操作。他们使用CPU
在C++03中编程时,我们不能将未命名的临时T()传递给函数voidfoo(T&);。通常的解决方案是给临时命名,然后像这样传递它:Tv;foo(v);现在,C++0x出现了——现在有了右值引用,定义为voidfoo(T&&)的函数将允许我传递一个临时值。这让我想到了我的问题:既然一个接受右值引用的函数既可以接受右值引用(未命名的临时对象)也可以接受左值引用(命名的非常量引用),是否有任何理由在函数参数中再使用左值引用?我们不应该总是使用右值作为函数参数吗?当然,一个接受左值引用的函数会阻止调用者传递一个临时值,但我不确定这是否是一个有用的限制。 最佳答案
在C++03中编程时,我们不能将未命名的临时T()传递给函数voidfoo(T&);。通常的解决方案是给临时命名,然后像这样传递它:Tv;foo(v);现在,C++0x出现了——现在有了右值引用,定义为voidfoo(T&&)的函数将允许我传递一个临时值。这让我想到了我的问题:既然一个接受右值引用的函数既可以接受右值引用(未命名的临时对象)也可以接受左值引用(命名的非常量引用),是否有任何理由在函数参数中再使用左值引用?我们不应该总是使用右值作为函数参数吗?当然,一个接受左值引用的函数会阻止调用者传递一个临时值,但我不确定这是否是一个有用的限制。 最佳答案
(与此问题IsItSafetoCastAwayvolatile?相关,但不完全相同,因为该问题与特定实例有关)是否有过抛弃volatile被不视为危险做法的情况?(一个特别的例子:如果声明了一个函数voidfoo(long*pl);我必须实现voidbar(volatilelong*pl);由于我的部分实现需要bar()调用foo(pl),那么我似乎无法让它按原样工作,因为编译foo()和编译bar()的调用者不兼容。)作为推论,如果我有一个volatile变量v,并且我想用别人的函数voidfoo(long*pl),那个人告诉我它是安全的,我可以在调用之前直接转换指针,我的直觉是告诉
(与此问题IsItSafetoCastAwayvolatile?相关,但不完全相同,因为该问题与特定实例有关)是否有过抛弃volatile被不视为危险做法的情况?(一个特别的例子:如果声明了一个函数voidfoo(long*pl);我必须实现voidbar(volatilelong*pl);由于我的部分实现需要bar()调用foo(pl),那么我似乎无法让它按原样工作,因为编译foo()和编译bar()的调用者不兼容。)作为推论,如果我有一个volatile变量v,并且我想用别人的函数voidfoo(long*pl),那个人告诉我它是安全的,我可以在调用之前直接转换指针,我的直觉是告诉
我知道当从多个线程或进程写入的内存位置读取时,volatile关键字应该用于该位置,如下面的某些情况,但我想了解更多有关哪些限制的信息它真的对编译器有用吗?基本上编译器在处理这种情况时必须遵循什么规则,是否存在任何异常(exception)情况,尽管同时访问内存位置,但程序员可以忽略volatile关键字。volatileSomeType*ptr=someAddress;voidsomeFunc(volatileconstSomeType&input){//functionbody} 最佳答案 你知道的都是假的。Volatile不用
我知道当从多个线程或进程写入的内存位置读取时,volatile关键字应该用于该位置,如下面的某些情况,但我想了解更多有关哪些限制的信息它真的对编译器有用吗?基本上编译器在处理这种情况时必须遵循什么规则,是否存在任何异常(exception)情况,尽管同时访问内存位置,但程序员可以忽略volatile关键字。volatileSomeType*ptr=someAddress;voidsomeFunc(volatileconstSomeType&input){//functionbody} 最佳答案 你知道的都是假的。Volatile不用
自VisualC++2005起,Microsoft对C++标准不要求的volatile类型的访问做出了额外的排序保证。C++标准中是否确实禁止了这些保证?TheMicrosoftdocumentation好像是这么想的。请让我知道标准是否允许微软实现的排序,并对这个错误报告进行投票:/volatile:msdocumentationmangleswhat"ISOcompliant"means 最佳答案 只要满足标准规定的要求,实现当然可以做超出要求的事情。向volatile对象添加释放/获取语义肯定在范围内。我认为C++委员会没有兴
自VisualC++2005起,Microsoft对C++标准不要求的volatile类型的访问做出了额外的排序保证。C++标准中是否确实禁止了这些保证?TheMicrosoftdocumentation好像是这么想的。请让我知道标准是否允许微软实现的排序,并对这个错误报告进行投票:/volatile:msdocumentationmangleswhat"ISOcompliant"means 最佳答案 只要满足标准规定的要求,实现当然可以做超出要求的事情。向volatile对象添加释放/获取语义肯定在范围内。我认为C++委员会没有兴