Re[8]: Многопоточность
От: Философ Ад http://vk.com/id10256428
Дата: 22.12.20 19:52
Оценка:
Здравствуйте, 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() не может произойти тоже самое?
Всё сказанное выше — личное мнение, если не указано обратное.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.