Стоимость вызова функции связана с набором операций, необходимых для перехода из данной области в другую, то есть из текущего выполнения в область другой функции. Рассмотрим следующий код:
void foo(int w) { int x, y, z; ...; }
int main() { int a, b, c; ...; foo(b); ...; }
Выполнение начинается в main()
, и вы можете загрузить некоторые переменные в регистры / память. Когда вы достигнете foo()
, набор переменных, доступных для использования, будет другим: значения a, b, c
недоступны , недоступны функцией foo()
, и, если вы исчерпаете доступные регистры, сохраненные значения будут должны быть пролиты на память.
Проблема с регистрами появляется на любом языке. Но некоторые языки нуждаются в более сложных операциях, чтобы перейти из области в область: C ++ просто помещает все, что требуется от функции, в стек памяти, поддерживая указатели для окружающих областей (в этом случае, запустив foo()
, вы сможете чтобы достичь определения w
в области действия main()
.
Другие языки должны распределять и передавать сложные данные, чтобы обеспечить доступ к окружающим переменным области действия. Эти дополнительные распределения и даже поиск определенных меток в пределах окружающие области видимости могут значительно повысить стоимость вызовов функций.
Делегаты обычно реализуются с использованием протоколов вместо селекторов. Это более формальный способ взаимодействия между классами, который в основном полезен, когда может потребоваться более одного метода.
Цель / действие обычно используются для соответствия «событийной» ситуации, такой как щелчок, срабатывание таймера и т. д.