2010-08-24 5 views

ответ

8

Это была адаптация к соглашению о вызове pascal для 32-битного кода. Паскаль был вызовом соглашения для 16-битных операционных систем, таких как OS/2 и Windows 3. Почему pascal был выбран, это немного догадка, даже тогда я был маленьким щенком, но он немного более эффективен. Что имело значение, когда 640 КБ было все, с чем вам пришлось работать.

Большинство функций Win32 не являются истинными stdcall, поскольку он также предписывает, как экспортированная функция была декорирована перед представлением компоновщику. Как void Mumble (int arg) становится _Mumble @ 4. Число после @ описывает размер кадра активации. Но большинство функций Win32 экспортируются без каких-либо украшений. Вероятно, чтобы дать программисту шанс для работы GetProcAddress(). Я думаю, что украшение предназначалось для того, чтобы помочь компоновщику обнаружить несоответствия между объявленной функцией API-функции и фактической. Наличие несоответствия в количестве переданных аргументов является автоматическим kaboom, поскольку вызываемый вызовет больше или меньше аргументов из стека, а затем передан. Трудно диагностировать тоже. Слабость stdcall, соглашение cdecl не имеет этой проблемы.

Внутренний вызов - это смешанная сумка между stdcall, cdecl и thiscall. Не могу сказать, что я когда-либо обнаружил шаблон, хотя одноэтапный код Windows - это не то, что мне нравится делать.

+2

Отсутствие украшения символа связано с тем, что двоичные файлы winapi используют файлы '.def' для экспорта (который разделяет декорации и/или использует ordianl), это упрощает импорт через GetProcAddress, поскольку нет символьного украшения – Necrolis

+0

Хороший момент, я думаю, ты прав. –

4

Код, скомпилированный с помощью stdcall, значительно меньше кода, скомпилированного с помощью cdecl (альтернатива). В то время, когда было принято решение, меньший код был более быстрым.

+0

На самом деле я предпочел ответ Ханса Пассанта на мою, но что бы там ни было. –

+0

Поскольку вы являетесь микрософте (в течение длительного времени), я выбрал ваш ответ. – Benjamin

+0

У вас есть доказательства этого иска? Интуитивно я думаю, что это должна быть стирка между stdcall и cdecl, а googling не приносит никаких сравнений по размеру между двумя соглашениями о вызовах. –