2011-01-24 6 views
8

В C/C++ (в частности, я использую MSVS), в какой ситуации вам когда-нибудь нужно будет беспокоиться о том, чтобы определить соглашение о вызове для определения функции? Всегда ли они важны? Не соответствует ли вам возможность выбора оптимального соглашения при необходимости (например, fastcall и т. Д.).MS Visual C++: Когда вам следует заботиться об использовании соглашений о вызовах?

Возможно, мое понимание отсутствует, но я просто не вижу, когда их будет случай, когда программисту нужно будет заботиться о вещах, подобных порядку, который аргументы помещаются в стек и так далее. Я также не понимаю, почему оптимизация компилятора не сможет выбрать, какая схема лучше всего подходит для этой конкретной функции. Любые знания, которые могли бы мне дать, были бы замечательными. Благодаря!

+0

Это чисто уродливое унаследованное из-за плохого дизайна Windows 1.0, которое было перенесено вперед без причины. До тех пор, пока вы используете правильные заголовки для получения прототипов для функций библиотеки, которые вы вызываете, вам не нужно тратить на это никаких усилий, кроме, может быть, при написании функций обратного вызова, которые необходимы для конкретного соглашения о вызовах. –

+0

R, вы имеете в виду, что вызовы конвенций не важны для быстрого кода? – Mandrake

ответ

6

Вам не нужно заботиться о 64-битных аппликациях, поскольку существует только одно соглашение о вызове.

Вы должны заботиться о 32-разрядных приложениях в следующих случаях:

  • Вы взаимодействуете с библиотеками 3 участника и заголовки для этих библиотек не объявляли правильное соглашение о вызовах.
  • Вы создаете библиотеку или DLL для использования кем-то другим. Вам нужно принять решение о вызывающем соглашении, чтобы другой код использовал правильное соглашение о вызове при вызове вашего кода.
+1

+1 для точки около 64-бит, имеющей только одно соглашение о вызове. –

+1

на самом деле, 64 бит имеет два соглашения о вызовах по крайней мере на x86_64 - соглашение о вызове Microsoft и стандартное соглашение о вызове –

+0

Я только что узнал, что 64 имеет только один – Mandrake

10

В общих чертах, соглашение о вызовах важно, когда вы интеграции кода, который будучи составленную различных компиляторов. Например, если вы публикуете DLL, которая будет использоваться вашими клиентами, вы должны убедиться, что все функции, которые вы экспортируете, имеют согласованное, ожидаемое соглашение о вызове.

Вы правы, что в рамках одной программы компилятор обычно может выбрать, какое соглашение о вызове использовать для каждой функции (а правила обычно довольно простые).