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

有没有一种方法来强制C中的函数内嵌?

  •  6
  • Trap  · 技术社区  · 16 年前

    据我所知,没有办法提示C编译器内联一个特定的函数,我猜想它是这样设计的。

    我还认为,不让程序员指定什么是内联的,什么不是一般的好主意,因为这意味着你认为你比JIT编译器更聪明(我尊重那些真正的编译器),但是,如果我想指定代码的关键部分需要以任何代价非常快,不管如何实现在目标机器上?到目前为止,您还不能做这样的事情,我想知道C语言和JIT是否都支持这个特性。

    在我的例子中,我知道目标机器是什么,并且我知道函数内联将有助于提高性能。这让我想到,强制函数内联的唯一方法是了解在什么情况下JIT会这样做,但我也不认为这是一个好主意,

    任何有关这个问题的说明都会受到赞赏。

    谢谢。

    5 回复  |  直到 12 年前
        1
  •  4
  •   Samuel Jack    12 年前

    随着.NET 4.5的出现,情况发生了一些变化。

    现在可以用属性修饰一个方法。 [MethodImplAttribute(MethodImplOptions.AggressiveInlining)] 如果可能的话,这将导致它被JIT内联。

    this blog 了解更多详细信息。

        2
  •  10
  •   Greg Beech    16 年前
        3
  •  4
  •   FlySwat    16 年前

    我最近把它作为基准:

    http://www.gfilter.net/junk/BubblesortBenchmark.jpg (越高越差)

    正如您所知道的,clr和jvm在方法内联方面都比以往任何时候都要好。

        4
  •  3
  •   Larry OBrien    16 年前
    if(performance < ACCEPTABLE){
       if(profiler.showsAffectOfMethodCallOverhead() && seriouslyWeDoubleChecked()){
          if(runtimeContext.isReallyStableAndNotProneToChange() && weNeedToGetThisThingBatOutOfHellFast()){
              return thisIsOneOfTheFewTimesWhenANativeExternalFunctionMayBeWorthIt();
          }
       }
     }
     return dontWorryAboutIt();
    

    如果您正在执行这条罕见的路径,请中断您的C或ASM。