Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
'的示例;挥发性';防止C#中的编译器优化?_C#_.net_Concurrency_Synchronization_Volatile - Fatal编程技术网

'的示例;挥发性';防止C#中的编译器优化?

'的示例;挥发性';防止C#中的编译器优化?,c#,.net,concurrency,synchronization,volatile,C#,.net,Concurrency,Synchronization,Volatile,据我所知,C#中的“volatile”修饰语有两种效果: 根据需要为目标处理器插入围栏 防止某些编译器优化 在x86/amd64上,(1)是不相关的。这些处理器不需要为易变语义设置围栏。(不过,ia64是不同的。) 因此,我们将讨论(2)。但是,对于我尝试过的示例,volatile对jit-ted程序集没有任何影响 我的问题是:你能举一个C代码示例吗?在一个字段上添加一个“volatile”修饰符会导致不同的jit ted汇编代码?也许就是你要找的。Marc Gravell对缺少volatile

据我所知,C#中的“volatile”修饰语有两种效果:

  • 根据需要为目标处理器插入围栏
  • 防止某些编译器优化
  • 在x86/amd64上,(1)是不相关的。这些处理器不需要为易变语义设置围栏。(不过,ia64是不同的。)

    因此,我们将讨论(2)。但是,对于我尝试过的示例,volatile对jit-ted程序集没有任何影响

    我的问题是:你能举一个C代码示例吗?在一个字段上添加一个“volatile”修饰符会导致不同的jit ted汇编代码?也许就是你要找的。Marc Gravell对缺少volatile关键字会导致问题有一个很好的解释

    还讨论了这个问题


    值得一提的是(正如Marc所做的那样),编译器优化只有在以发布模式编译时才能看到。

    太棒了,这正是我想要的!这里,volatile确实会导致不同的汇编代码。如果有人好奇,没有volatile修饰符,字段值会缓存在寄存器中。而且,当该值位于寄存器中时,循环内核将永远不会“注意”另一个内核所做的更新。