内联函数

✍ dations ◷ 2025-12-02 12:26:42 #最优化

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

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

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

此外,在一些语言中,内联函数与编译模型联系紧密:如在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为编译单元外部也可见。

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

相关

  • 拉姆·纳特·科温德拉姆·纳特·科温德(Ram Nath Kovind,1945年10月1日-)是现任印度总统,隶属印度人民党。科温德于1991年加入印度人民党。他于1994年至2006年担任联邦院议员。2015年至2017年期间担
  • 蒸馏水蒸馏水(英语:Distilled water)是纯水的一种,是经过处理后纯洁、干净,不含有杂质或细菌的水。以符合生活饮用水卫生标准的水部 (部首)为原水,通过电渗析器法、离子交换器法、反渗透
  • 膜攻击复合物膜攻击复合物(MAC),是一种通常生成于致病细菌表面的结构。人体补体系统的替代补体途径、经典补体途径、凝集素途径均可产生这种复合物。该复合物是免疫系统的效应蛋白之一,它可
  • 1589年商朝第二任君主外丙继位。埃及人发明的一种全新的历法,该历法来源于月亮和星星。该历法比巴比伦历法要先进。
  • 日式猪排日式豬排(日文:豚カツ,英文:Tonkatsu)又称吉列猪排;zh-hk日式豬排,以吉列的方式炸猪排。吉列猪排选用较厚身的猪排,裹上蛋汁、面包屑及炸粉油炸,最后切成数块淋上猪排酱,佐以卷心菜丝
  • 威廉一世 (奥兰治)威廉一世,奥兰治亲王(荷兰语:Willem I,也称沉默者威廉(荷兰语:Willem de Zwijger)、奥兰治的威廉(荷兰语:Willem van Oranje),1533年4月24日-1584年7月10日)。奥兰治的威廉是尼德兰革命中
  • 丹尼尔·阿尔扎尼丹尼尔·阿尔扎尼(英语:Daniel Arzani,波斯语:دَنیل ارزانی‎;1999年1月4日-),伊朗裔澳大利亚职业足球员,司职攻击中场或翼锋,现时被英超的曼城外借至苏超的凯尔特人,他同
  • 贝尔吉塔公主国王陛下 王后陛下贝尔吉塔公主(瑞典语:Birgitta Ingeborg Alice;1937年1月19日-),是瑞典和霍亨索伦的公主,瑞典国王卡尔十六世·古斯塔夫的姐姐。与约翰·格奥尔格王子(英语:Prince
  • XtubeXTube是一个位于荷兰的色情影片分享网站。它允许用户与其他用户分享成人影视作品。网站使用规章制度声明使用者必须是十八岁或以上。
  • 安德鲁安德鲁(Andrew),在希腊语中为安德烈(Andreas),在日尔曼语中为安德斯,昵称为安迪。