_s4 Не совсем понял зачем отдельный поток. __cdecl сам выравнивает стек после вызова функции, т.к. он знает на момент инстанцирования вызова количество переданных параметров. На С++ вообще не получится __stdcall сделать с произвольным числом параметров без хаков. Мой предыдущий пост относится к случаю когда ты сам можешь манипулировать стеком.
_DEN_ Вряд ли... stdcall и cdecl вздувают стек одинаково. Единственно, что при cdecl очистка стека чуть запаздывает. Мне кажется, _s4 хотел сэкономить на размере кода, т.е. на инструкции add esp, <args size>. Вряд ли искусственный stdcall обойдётся дешевле 3-х байт.
green Я имею ввиду что речь идет о wsprintf("%d", 10, 10); т.е. когда передали параметров больше чем откатили стек.
_DEN_ Компилятор сам откатит, сколько положил. Как раз cdecl здесь является залогом правильной очистки стека.
Извиняюсь был не прав На мгновение, с перепугу показалось, что этот код почему то стек от параметров не очищает =))
Ещё обратил внимание (с оптимизицией по скорости /O2 и с /Ox) если примерно вот такой код на си: Код (Text): /* Вообщем то самое важное... */ char buffer[40]; int a = 10; memset(buffer,'\0',40); // ... вот тут, если заполянешь буфер, <= 40 байт... wsprintf(buffer,"%d",a); /*...то вот такой код компилятор генерирует: .text:0040100E xor eax, eax .text:00401010 push 0Ah .text:00401012 mov [esp+4], eax .text:00401016 mov [esp+8], eax .text:0040101A mov [esp+0Ch], eax .text:0040101E mov [esp+10h], eax .text:00401022 mov [esp+14h], eax .text:00401026 mov [esp+18h], eax .text:0040102A mov [esp+1Ch], eax .text:0040102E mov [esp+20h], eax .text:00401032 mov [esp+24h], eax .text:00401036 mov [esp+28h], eax .text:0040103A lea eax, [esp+4] .text:0040103E push offset asc_402044 ; "%" .text:00401043 push eax .text:00401044 call ds:__imp__wsprintfA */ Мне очень интересно, неужели такой код работает быстрее, чем например простые строковые инструкции типа stos итд ?