在 Snow Leopard 中引入的阻止对象的其中一项适用于以前通过回调处理的情况。传递上下文的语法要干净得多。但是,我还没有看到任何有关以这种方式使用块的性能影响的信息。使用块时我应该注意哪些性能缺陷(如果有的话),特别是作为 C 风格回调的替代品?
问问题
3811 次
2 回答
11
块运行时看起来非常紧凑。块描述符和函数是静态分配的,因此它们可以扩大程序的工作集,但您只需为从封闭范围引用的变量“支付”存储费用。非全局块文字和__block
变量是在堆栈上构造的,没有任何分支,因此您不太可能因此而减速。调用一个块只是result = (*b->__FuncPtr)(b, arg1, arg2)
;这相当于result = (*callback_func_ptr)(callback_ctx, arg1, arg2)
。
如果您将块视为“编写自己的上下文结构并为您处理丑陋的打包、内存管理、强制转换和取消引用的回调”,我想您会意识到块在运行时的成本很低,并且在编程时间。
于 2010-04-21T04:56:14.293 回答