内联函数

✍ dations ◷ 2025-12-04 15:34:34 #最优化

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

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

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

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

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

相关

  • 卵裂受精卵高速分裂,但总的体积和物质并不增加:细胞的数目越来越多,个头却越来越小。这壹时期即为卵裂(cleavage)。卵裂按其分裂形式可以分为下列两类:脊椎动物常见卵裂分为两大类:完全
  • 东京慈惠会医科大学东京慈惠会医科大学(日语:とうきょうじけいかいいかだいがく,英语:The Jikei University School of Medicine),是一所位在日本东京都港区的私立大学。1881年创校。1921年设立大学,
  • 朱敬一朱敬一(1955年10月29日-),台湾经济学家。台大商学系毕业,美国密歇根大学经济学博士,曾任中华民国(台湾)常驻世界贸易组织(WTO)代表团常任代表、美国国家科学院海外院士。朱敬一于1998
  • 雏菊雏菊(学名:Bellis perennis)是菊科雏菊属的一种,别名长命菊、延命菊,原产于欧洲,原种被视为丛生的杂草,开花期在春季。雏菊在原产地是多年生草本植物,学名的种加词perennis也含有“
  • 鲁斯塔维二台鲁斯塔维2(格鲁吉亚语: სამაუწყებლო კომპანია რუსთავი 2)是格鲁吉亚的一家电视台,也是格鲁吉亚最为成功的商业电视台。鲁斯塔维2成立于1994年,因设立
  • 雷德尼茨亨巴赫雷德尼茨亨巴赫(德语:Rednitzhembach)是德国巴伐利亚州的一个市镇。总面积13.02平方公里,总人口6814人,其中男性3274人,女性3540人(2011年12月31日),人口密度523人/平方公里。
  • 维基媒体基金会维基媒体基金会(英语:Wikimedia Foundation,WMF)是美国的一个非营利慈善组织,其总部设在加利福尼亚州旧金山,运转多个Wiki项目。该基金会主要因为托管网络百科全书——维基百科,以
  • 重装机兵 异传《重装机兵 异传》(日语:メタルマックス ゼノ,英语:Metal Max Xeno,港台译作“坦克战记 异传”)是角色扮演游戏系列重装机兵的游戏作品,对应PlayStation 4和PlayStation Vita平台,预
  • 和平路 (梓官区)和平路(Heping Rd.)为高雄市梓官区的南北向重要道路,全线编号台17线。起端于进学路口接信义路,末端于八德路续行大舍北路。是梓官区往来北高雄沿海与楠梓区右昌之间的重要路段之
  • 天主教罗克福德教区天主教罗克福德教区(拉丁语:Dioecesis Peoriensis、英语:Roman Catholic Diocese of Rockford)是美国一个罗马天主教教区,属芝加哥总教区。成立于1908年9月23日。范围包括伊利诺