【问题标题】:Will C functions with Objective-C be inlined?带有 Objective-C 的 C 函数会被内联吗?
【发布时间】:2013-10-09 14:41:37
【问题描述】:
  1. 典型的编译器会内联一个调用一个或多个 Objective-C 方法的 C 函数吗?例如:

    NSUInteger AACStringGetLength(NSString *string)
    {
        return [string length];
    }
    
  2. 带解释的彻底证明加分。

  3. 除了递归之外,还有哪些其他因素可能会阻止编译器内联 C 函数?

【问题讨论】:

  • 让你想到使用函数的是any different from methods。内联不能发生在动态上下文中,而这正是动态上下文。此外,内联该调用有什么好处?您仍然会收到无法优化的消息发送。如果您想了解内联可以为您做什么,请尝试询问有关内联方法的 IMP 的问题。
  • 不,不是。编译器编译“NSUInteger theLength = AACStringGetLength (myString);”是没有问题的就好像你写了“NSUInteger theLength = [myString length];”。

标签: objective-c c function inline message-passing


【解决方案1】:

AACStringGetLength() 可以内联到它的调用者中,前提是满足内联的其他要求。对 Objective-C 方法的调用不会阻止 C 函数的内联。

当然,Objective-C 方法本身不能内联,因为编译器无法知道没有异常动态调度正在进行。

可以防止内联的事情包括:

  • 调用者和被调用者位于不同的翻译单元(即不同的源代码文件),除非您使用某种链接时优化
  • 根据编译器的内联启发式方法,内联后调用者的代码可能会“太大”
  • 被调用者执行的控制流过于复杂,编译器的内联机制无法处理,因此它放弃了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 2022-07-13
    • 2017-01-05
    • 2011-08-23
    相关资源
    最近更新 更多