Кто несет ответственность за уборку? - PullRequest
2 голосов
/ 22 сентября 2009

Я хочу знать, кто отвечает за очистку стека

Предположим, у вас есть функция fun, скажем так:

var = fun(int x, int y, float z, char x);

когда будет вызван fun, он войдет в стек вместе с параметрами, затем, когда функция вернет, кто отвечает за очистку стека, является ли она функцией самостоятельно или «var», который будет содержать возвращаемое значение .

Еще одна вещь, кто-нибудь может объяснить концепции соглашений о вызовах?

Ответы [ 3 ]

9 голосов
/ 22 сентября 2009

Вы сами ответили на ответ: Соглашение о вызовах .

Соглашение о вызовах аналогично контракту . Он решает следующие вещи:

  • Кто отвечает за очистку параметров.
  • Как и в каком порядке параметры передаются в вызываемую функцию.
  • Где хранится возвращаемое значение.

Существует много различных соглашений о вызовах в зависимости от платформы и среды программирования. Два общих соглашения о вызовах на платформах x86:

STDCALL

Параметры передаются в стек справа налево. Вызванная функция *1024* очищает стек.

Cdecl

Параметры передаются в стек справа налево. Вызывающая функция *1032* очищает стек.

В обоих случаях возвращаемое значение находится в регистре EAX (или ST0 для значений с плавающей запятой)

Многие языки программирования для платформы x86 позволяют указывать соглашение о вызовах, например:

Delphi

function MyFunc(x: Integer): Integer; stdcall;

Microsoft C / C ++

int __stdcall myFunc(int x)

Некоторые примечания по использованию:

При создании простого приложения редко требуется изменить или узнать о соглашении о вызовах, но есть два типичных случая, когда вам нужно заняться соглашениями о вызовах:

  • При вызове внешних библиотек, например Win32 API: Вы должны использовать совместимые соглашения о вызовах, в противном случае стек может быть поврежден.
  • При создании встроенного кода на ассемблере: вы должны знать, в каких регистрах и где в стеке находятся переменные.

Для получения дополнительной информации я рекомендую эти статьи Википедии:

5 голосов
/ 22 сентября 2009

соглашение о вызовах относится к тому, кто выполняет очистку стека; звонящий или вызываемый.

Соглашения о вызовах могут отличаться:

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

Архитектуры почти всегда имеют больше чем одно возможное соглашение о вызовах.

0 голосов
/ 22 сентября 2009

К тому времени, когда строка завершится, var будет содержать значение, возвращаемое fun (), и любая память в стеке, используемая fun, исчезнет: «push», «pop» all tidy.

Соглашения о вызовах: все, что компилятор организует, чтобы веселье могло выполнять свою работу. Рассмотрим эти параметры x, y, z. В каком порядке они помещаются в стек (действительно, они передаются через стек)? Неважно, пока звонящий и вызываемый согласны! Это соглашение.

...