Здравствуйте, vlp, Вы писали:
Ф>>Примеры дизассемблера тебе ничего не дадут: сегодня это один пример, а завтра версия джиттера поменяется.
vlp>Я просил пример того, как прямо сейчас, с текущей версией компилятора и джиттера, возможна ситуация, которой тут всех пугают и как volatile в ней помогает.
vlp>Тут, судя по ответам, в треде одни философы-теоретики, примеров нет.
Зачем тебе реальный пример? Тебя теоритическая возможность засесть на пару недель дебага не достаточно?
На x86 cейчас там обычный cmp с ячейкой, реально генерируемый код выглядит вот так:
00007ff9`6153096b 80790900 cmp byte ptr [rcx+9],0
00007ff9`6153096f 7549 jne 00007ff9`615309ba
Можешь теоретически объяснить, почему так? Почему не
mov rax, byte ptr [rcx+9]
cmp rax,0
jne SomeOffset
???
Полагаю, что потому что в системе команд присутствует cmp с ячейкой памяти? Ну ещё это может быть быстрее.
А если нет, если через регистр окажется быстрее!?
vlp>На практике и без volatile этого не делается, вместо этого значение всегда читается из памяти (почему-объяснять относительно долго)/
Даже на практике в диассемлерных листнингах встречается вот такое:
00007ff9`615508fb 488b4808 mov rcx,qword ptr [rax+8]
00007ff9`615508ff 83790c02 cmp dword ptr [rcx+0Ch],2
Т.е. в этом случае действуют через промежуточный регистр. Почему ты думаешь, что в случае ThrowIfDisposed() не может произойти тоже самое?