Что если из первого параметра функции __fastcall взять адрес (он же в регистре edx)? Как будет внутри устроен код?
Если так просто, то как тогда функции с переменным числом параметров работают с __fastcall ? Вот кусок кода после компилятора дизассемблированный. edx вроде не используется... void __fastcall fx2(tt d) { 00CC2410 push ebp 00CC2411 mov ebp,esp 00CC2413 sub esp,0CCh 00CC2419 push ebx 00CC241A push esi 00CC241B push edi 00CC241C push ecx 00CC241D lea edi,[ebp-0Ch] 00CC2420 mov ecx,3 00CC2425 mov eax,0CCCCCCCCh 00CC242A rep stos dword ptr es:[edi] 00CC242C pop ecx 00CC242D mov ecx,offset _959A5CFF_ConsoleApplication5@cpp (0CCE029h) 00CC2432 call @__CheckForDebuggerJustMyCode@4 (0CC1370h) int nu =(int) &d; 00CC2437 lea eax,[d] 00CC243A mov dword ptr [nu],eax } Может он параметры через стек передавать начал и изменил тип(прототип) функции?
Отладка же. Отладке в оптимизацию не смотрят. --- Сообщение объединено, 7 фев 2023 --- https://devblogs.microsoft.com/oldnewthing/20131128-00/?p=2543 Да, кстати Вариадикам просто тихо подменяется на __cdecl, это единственное соглашение о вызовах поддерживаемое вариадиками.
блин понял в чём косяк ... передавал структуру - а она сразу в стек при любом раскладе... - это верно а __fastcall работает потому, что при ... аргументе скорее всего его тоже в стек ложит --- Сообщение объединено, 7 фев 2023 --- ценнейшая информация - сам бы не нашёл --- Сообщение объединено, 7 фев 2023 --- а можно как-то без отладки посмотреть? (при Release всё сразу оптимизирует и убирает)
Агрессивные оптимизации могут всё выкинуть, можно их побороть как нибудь типа взять указатель на функцию и скормить куда нибудь как параметр чтобы компилятор не был уверен что функция никем не используется.