内联函数

✍ dations ◷ 2025-12-07 03:24:33 #最优化

在计算机科学中,内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展);也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方(上下文),从而节省了每次调用函数带来的额外时间开支。但在选择使用内联函数时,必须在程序占用空间和程序执行效率之间进行权衡,因为过多的比较复杂的函数进行内联扩展将带来很大的存储资源开支。另外还需要特别注意的是对递归函数的内联扩展可能引起部分编译器的无穷编译。

内联扩展是一种特别的用于消除调用函数时所造成的固有的时间消耗方法。一般用于能够快速执行的函数,因为在这种情况下函数调用的时间消耗显得更为突出。这种方法对于很小的函数也有空间上的益处,并且它也使得一些其他的优化成为可能。

没有了内联函式,程式员难以控制哪些函数内联哪些不内联;由编译器自行决定是否内联。加上这种控制维度准许特定于应用的知识,诸如执行函式的频繁程度,被利用于选择哪些函数要内联。

此外,在一些语言中,内联函数与编译模型联系紧密:如在C++中,有必要在每个使用它的模块中定义一个内联函数;与之相对应的,普通函数必须定义在单个模块中。这使得模块编译独立于其他的模块。

通常,在C语言中,内联展开的功能由带参宏(Macros)在源码级实现。内联提供了几个更好的方法:

C++,C99. C11和GNU C都支持内联函数,然而1989 ANSI C,这个最被广泛使用的C标准却不支持。在Ada中,关键字“pragma”可以用来声明内联。其他的大部分编程语言,包括Java和函数式语言,不支持内联函数,但他们的编译器常常进行强制性的内联扩展。不同的编译器在内联扩展上有处理不同复杂程度函数的能力。主流的C++编译器如Visual C++和GCC提供了一个选项来自动内联任何一个合适的函数,即使它们没有被声明为内联函数。

对于C++,inlineextern inline同义:内联函数在各个编译单元都可能会生成一份,要求各处定义完全一致。内联函数在C++中的写法如下:

inline int max (int a, int b){    if (a > b)        return a;    else        return b;}
a = max (x, y); 

对于C99,inline为编译单元内部可见,extern inline为编译单元外部也可见。

除了通常使用内联扩展可能带来的问题,作为一种编程语言特性的内联函数也可能并没有看起来那么有效,原因如下:

相关

  • 酯质脂类(英语:Lipid),又称脂质,这是一类不溶于水而易溶于脂肪溶剂(醇、醚、氯仿、苯)等非极性有机溶剂,由脂肪酸与醇作用脱水缩合生成的酯及其衍生物统称为脂类,其中包括脂肪、蜡、类固
  • 晶体缺陷晶体缺陷(英语:crystallographic defect)是指晶体结构中周期性的排列规律被打破的情况。理想的晶体,具有周期性的晶体结构(这称为“长程有序”)。原子或分子的位置以固定的距离重
  • 化学势在热力学中,某种物质的化学势指的是,在化学反应或者相变中,此物质的粒子数发生改变时所吸收或放出的能量。在混合物中的某种物质的化学势定义为此热力学系统的吉布斯自由能对此
  • 美国内战的转捩点对于美国内战的转捩点,各家观点极不一致。美国内战中最常被引用为决定性事件者或为葛底斯堡战役,但另有其他同具价值的选择。转捩点观念为,经此事件后,大多数的观察家会认为其后
  • 清双唇擦音清双唇擦音是辅音的一种,用于一些口语中。此音的国际音标符号是⟨ɸ⟩;X-SAMPA音标符号则是⟨p\⟩。汉语普通话没有此音,个别人将声母⟨f⟩发成清双唇擦音。虽然该音的符号是由
  • 硫化氢钾硫化氢钾是具有化学式KHS的无机化合物,是无色的盐,由阳离子K+和氢硫根阴离子− 组成。它是硫化氢与氢氧化钾半中和的产物,用于合成一些有机硫化合物。 可通过用H2S中和KOH水溶
  • GIRLS' GENERATION 'THE BEST LIVE' at TOKYO DOMEGIRLS' GENERATION 'THE BEST LIVE' at TOKYO DOME是韩国女子组合少女时代日本出道四周年演唱会。在2014年8月25日, SM娱乐宣布少女时代将会于东京巨蛋举行日本出道四周年演
  • 郝进礼郝进礼(1916年11月30日-2011年3月9日),圣名安德肋,天主教西湾子教区主教。郝进礼出生于1916年11月30日,1943年晋升司铎。1958年被捕,1981年获释,担任公会镇本堂神父。1984年9月14日
  • 池田利隆池田利隆(1584年10月10日—1616年7月26日)是安土桃山时代至江户时代前期的武将、大名。播磨国姬路藩第2代藩主。冈山藩池田家宗家第2代。父亲是池田辉政。在天正12年(1584年)9月
  • 哈尼亚乡坐标:57°43′10″N 27°3′9″E / 57.71944°N 27.05250°E / 57.71944; 27.05250哈尼亚乡(爱沙尼亚语:Haanja vald),是爱沙尼亚的一个乡,位于该国东南部,由沃鲁县负责管辖,首府设