これらは、概念的に関連しているが機能的に異なる 2 つのアクションを実行します。
asm volatile ("" : : : "memory")
その時点でメモリ アクセスの順序を変更しないようにコンパイラに指示します (それ以外の場合は、最適化のために自由に実行できます)。これにより、コードに書き込まれたロードとストアが、その時点までに終了することが保証されます。コード。
asm volatile("sfence" : : : "memory")
実際の Intel ファミリの CPU コマンド (sfence) であり、最適化のためにストアを並べ替えないようにハードウェアに指示します (lfence および mfence ハードウェア命令もあります)。「メモリ」制約を追加すると、メモリアクセスの順序も変更しないようにコンパイラに指示されます。
ウィキペディアでは、この件についてまともな扱いをしています (http://en.wikipedia.org/wiki/Memory_barrier)。もう少し詳しく知りたい場合は、Intel プログラマーズ マニュアル (http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html/) を確認してください。