MS Visual C ++: когда следует заботиться об использовании соглашений о вызовах? - PullRequest
8 голосов
/ 24 января 2011

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

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

Ответы [ 2 ]

10 голосов
/ 24 января 2011

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

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

6 голосов
/ 24 января 2011

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

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

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