内联函数

✍ dations ◷ 2025-12-08 16:49:28 #最优化

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

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

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

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

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

相关

  • 诺曼征服诺曼人征服(Norman conquest)或诺曼人征服英格兰(法语:Conquête normande de l'Angleterre)指1066年法国诺曼底公爵威廉对英格兰的入侵及征服。这次征服改变了英格兰的走向,从此
  • 韩国清酒清酒(청주)是一种由粮食酿制而成的韩国米酒。清酒如名是清澈透明的。韩国知名的清酒品牌是“清河”(hangul:청하;hanja:淸河)。韩国各地的清酒各有特色,比如韩国庆州地区出产一种名
  • 取向力极性分子相互靠近时,因分子的固有偶极之间同极相斥异极相吸,使分子在空间按一定取向排列,使体系处于更稳定状态。这种固有的偶极间的作用力称为取向力,又称作偶极-偶极作用力(Dip
  • 麝香猫咖啡猫屎咖啡,又称麝香猫咖啡(英语:civet coffee,印尼语:Kopi Luwak,菲律宾语:kape motit, kape alamid, kape melô, kape musang)。在印尼语中,Kopi意为咖啡,Luwak意为麝香猫,猫屎咖啡的
  • 特兰奎巴特兰奎巴是1620年至1845年间丹麦在印度的殖民地,也是丹麦东印度公司在亚洲的根据地。“特兰奎巴”在丹麦文里拼作“Trankebar”或“Trangebar”,其词源为泰米尔文的“Tarangam
  • 太阳光发电太阳光伏系统,也称为光生伏特,简称光伏(Photovoltaics;字源“photo-”光,“voltaics”伏特),是指利用光伏半导体材料的光生伏打效应而将太阳能转化为直流电能的设施。光伏设施的核
  • 大通银行大通银行(英语:JPMorgan Chase Bank, N.A.,商业名称:Chase Bank,商标:大通、JP摩根、JP摩根大通)是一家美国的国家银行,是摩根大通的子公司,专注于商业和零售银行业务。大通银行与JP
  • 阿尔伯特县阿尔伯特县 (英语:Albert County)位于加拿大新不伦瑞克省东南部。在1967年该县政府撤销前,县治为霍普韦尔角(Hopewell Cape).该县成立于1845年,得名于阿尔伯特王子。2005年,该县
  • 画书大王《画书大王》简称为画王,是中国大陆第一份漫画杂志。1993年,《画书大王》创刊,这本由宁夏人民出版社出版的漫画刊物一出世即受到了广大中国的新读者的关注。她标志着连环画中的
  • 万兴乡 (成都市)万兴乡,是中华人民共和国四川省成都市龙泉驿区下辖的一个乡镇级行政单位。2019年12月,撤销万兴乡,将原万兴乡所属行政区域划归山泉镇管辖。万兴乡下辖以下地区:万兴场社区、斑竹