我在这里读到了关于内存围栏的信息......我需要对此进行一些澄清
asm volatile ("" : : : "内存")
这提供了编译器级别的内存栅栏,并且处理器在使用它时仍然可以进行重新排序。
无论如何,我可以使用类似的指令同时实现编译器级别的防护和处理器级别的防护吗?
我碰到,
asm volatile("sfence" : : : "memory")
这是做什么的?它是否仅提供编译器级别的存储防护?
对此的任何输入都将非常有帮助。
谢谢
我在这里读到了关于内存围栏的信息......我需要对此进行一些澄清
asm volatile ("" : : : "内存")
这提供了编译器级别的内存栅栏,并且处理器在使用它时仍然可以进行重新排序。
无论如何,我可以使用类似的指令同时实现编译器级别的防护和处理器级别的防护吗?
我碰到,
asm volatile("sfence" : : : "memory")
这是做什么的?它是否仅提供编译器级别的存储防护?
对此的任何输入都将非常有帮助。
谢谢
它们执行两个概念相关但功能不同的操作:
asm volatile ("" : : : "memory")
告诉编译器不要在该点周围重新排序内存访问(否则它可以自由地进行优化目的),以便您可以确保写入代码的加载和存储在您到达该点时完成编码。
asm volatile("sfence" : : : "memory")
是一个实际的 intel-family cpu 命令(sfence),它告诉硬件不要重新排序存储(还有 lfence 和 mfence 硬件指令)以进行优化;添加“内存”约束告诉编译器不要重新排序内存访问。
维基百科对这个主题有很好的处理(http://en.wikipedia.org/wiki/Memory_barrier);如果你想更深入一点,你应该查看英特尔程序员手册(http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html/)