【问题标题】:When isn't inlining safe?什么时候内联不安全?
【发布时间】:2014-06-10 13:44:26
【问题描述】:

我一直在阅读(例如在 Closure Compiler 和其他编译器中),函数内联并不总是安全。您能否提供一个不应进行函数内联的示例?

【问题讨论】:

    标签: optimization compiler-construction scope inline compiler-optimization


    【解决方案1】:

    在许多语言中,内联函数不会产生明显的语义影响,尽管它可能会影响程序的编译大小和执行时间。但是,在调用堆栈和/或局部变量绑定可见的语言中,情况并非如此。

    作为一个简单的例子,在 Javscript 中,局部变量 arguments 总是引用一个包含当前函数调用参数的类数组对象。显然,如果它发生的函数是内联的,它的语义就会改变。内联程序要么拒绝内联其主体引用 arguments 的函数,要么必须以保留语义的方式修改代码,可能通过创建另一个具有不同名称的局部变量并替换引用。

    另一个例子是(不推荐)使用eval。传递给eval 的字符串中的名称查找是在调用eval 的函数范围内完成的。例如:

    inner = function(s) { var x = 4; return eval(s); }
    outer = function(s) { var x = 3; return inner(s); }
    outer("x+1")
    

    这里outer返回的值是5。如果 inner 被内联,这将需要重命名其局部变量 x 以避免名称冲突,则返回的值将是 4。 (如果 innerouter 都被内联了,那么这个值可能又是别的东西了。)

    一般来说,内联调用eval 的函数会非常困难,因为没有简单的方法可以知道eval 的参数内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      相关资源
      最近更新 更多