首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Objective-C中使用异常的成本是多少?

在Objective-C中使用异常的成本是多少?
EN

Stack Overflow用户
提问于 2010-09-10 17:15:36
回答 2查看 1K关注 0票数 9

我的意思是在目前的clang或者说是gcc版本的实现中。

C++和Java的人总是告诉我,除非抛出异常,否则不会消耗任何性能。Objective-C也是如此吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-01 03:21:28

、C++和Java的人总是告诉我,除非抛出异常,否则不会消耗任何性能。Objective-C也是如此吗?

Short Answer

仅适用于64位OS X和iOS。

它们不是完全免费的。更准确地说,该模型进行了优化,以最大限度地减少常规执行期间的成本(将后果转移到其他地方)。

详细答案

在32位OS X和iOS上,即使不抛出异常,也会产生运行时成本。这些架构不使用零成本异常。

在64位OS X中,ObjC借用了C++的“零成本异常”。零成本异常的执行开销非常低,除非抛出。零成本异常有效地将执行成本转移到二进制大小。这是它们最初不在iOS中使用的主要原因之一。启用C++异常和RTTI可以增加超过50%的二进制大小--当然,我希望这些数字在纯ObjC中会低得多,因为在解开时要执行的更少。

在arm64中,异常模型从Set Jump Long Jump更改为Itanium派生的零成本异常(由程序集判断)。

然而,惯用的ObjC程序并不是为了从异常中恢复而编写或准备的,所以您应该将它们保留到您不打算恢复的情况下(如果您决定使用它们的话)。有关更多详细信息,请参阅Clang manual on ARC和参考页面的其他部分。

票数 9
EN

Stack Overflow用户

发布于 2010-09-10 17:55:34

根据MacOSXv10.5中Objective-C运行时的一些2007发行说明,他们已经重写了Objective-C异常的64位实现,以提供“零成本”的try块和与C++的互操作性。

显然,这些“零成本”try块在进入try时不会产生时间损失,这与必须调用setjmp()和其他函数的32位代码块不同。显然,投掷它们“要昂贵得多”。

这是我能在Apple的发布说明中找到的唯一一点信息,所以我必须假设这仍然适用于当今的运行时,因此,32位异常=昂贵,64位异常=“零成本”

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3683439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档