Время выполнения блоков выглядит довольно плотно. Дескрипторы блоков и функции размещаются статически, поэтому они могут расширить рабочий набор вашей программы, но вы «платите» в хранилище только за переменные, на которые вы ссылаетесь из прилагаемой области видимости. Неглобальные литералы блоков и переменные __block
создаются в стеке без каких-либо ветвлений, так что вы вряд ли столкнетесь с большим замедлением из-за этого. Вызов блока - просто result = (*b->__FuncPtr)(b, arg1, arg2)
; это сопоставимо с result = (*callback_func_ptr)(callback_ctx, arg1, arg2)
.
Если вы думаете о блоках как о «обратных вызовах, которые пишут свою собственную структуру контекста и обрабатывают уродливую упаковку, управление памятью, преобразование и разыменование для вас», я думаю, вы поймете, что блоки - это небольшие затраты во время выполнения огромная экономия времени на программирование.