+ 比較cmpl
に相当する命令です。movl
もしそうなら、白黒の違いは何ですか: (1)
LBB1_2:
cmpl $0, _data_ready(%rip)
je LBB1_2
および: (2)
LBB1_2:
movl _data_ready(%rip), %eax
testl %eax, %eax
je LBB1_2
(1)はwhile (!data_ready);
、data_ready がある場所に対して生成されます。volatile int data_ready = 0x0;
(2)はwhile (!data_ready.load(std::memory_order_acquire));
、data_ready の場所に対して生成されます。std::atomic<int> data_ready(0x0);
どちらの場合も、data_ready は別のスレッドによって 1 に設定されます。Intelmovl
は、アラインされたメモリ アクセスに対してアトミックであることを保証しており、アトミックであるようにも思われcmpl
ます。その場合、clang が異なるコードを生成するのはなぜですか? (正当な理由があると確信しているので、私は尋ねています)
また、これは volatile 変数が x86-64 プラットフォームの std::atomic と「同等」であることを意味しますか (これはもちろん何も意味せず、C++ 標準では保証されません)。
これを生成するコードは、この github リポジトリで入手できます