Здравствуйте, okman, Вы писали:
O>Обнаружил в Visual C++ 2015 странное поведение. Баг?
В x64 работает нормально.
В x86 вылетает на последней команде
В x64 этот код выглядит так
00007FF61979232F mov rcx,qword ptr [p]
00007FF619792333 call qword ptr [Pfn]
00007FF61979109B jmp parent::`vcall'{8}' (07FF619791A94h)
00007FF619791A94 mov rax,qword ptr [rcx]
00007FF619791A97 jmp qword ptr [rax+8]
В x86
00E82390 mov ecx,dword ptr [p]
00E82393 call dword ptr [Pfn]
00E8107D jmp parent::`vcall'{4}' (0E81A3Fh)
00E81A3F mov eax,dword ptr [esp+4]
00E81A43 mov eax,dword ptr [eax]
00E81A45 jmp dword ptr [eax+4] // здесь и падает
Зачем она в стек полезла, если [p] в регистре ecx —
Если заменить __vectorcall на __fastcall, то вместо последних 3 строк имеем
00251A3F mov eax,dword ptr [ecx]
00251A41 jmp dword ptr [eax+4]
что и должно быть.
Видимо, баг, да.