代码之家  ›  专栏  ›  技术社区  ›  Lothar

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

  •  9
  • Lothar  · 技术社区  · 14 年前

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

    C++和Java程序员总是告诉我,除非抛出异常,否则不需要任何性能。目标C也是这样吗?

    2 回复  |  直到 14 年前
        1
  •  9
  •   justin    9 年前

    C++和Java程序员总是告诉我,除非抛出异常,否则不需要任何性能。目标C也是这样吗?

    简短回答

    仅限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 以及参考页的其他部分。

        2
  •  6
  •   Matt Sheppard    12 年前

    根据Mac OS X V10.5中Objy-C运行时的2007个版本说明,他们已经重新编写了Objut-C异常的64位实现,以提供“零成本”的测试块和C++的互操作性。

    显然,与必须调用setjmp()和其他函数的32位对应块不同,这些“零成本”的try块在输入try时不会受到时间惩罚。显然,扔掉它们“要贵得多”。

    这是我在苹果的发行说明中能找到的唯一一点信息,因此我不得不假设这仍然适用于今天的运行时,因此,32位异常=昂贵,64位异常=零成本