内联函数

✍ dations ◷ 2025-07-04 10:48:38 #最优化

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

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

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

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

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

相关

  • 诺曼底王朝本条目是分类中的文章诺曼底王朝(1066年-1135年;英语:House of Normandy)是英格兰的一个王朝,共有四位诺曼底家族的国王先后统治英格兰,统治时间由征服王威廉之后的1066年开始,直至
  • 婺源.mw-parser-output ruby.zy{text-align:justify;text-justify:none}.mw-parser-output ruby.zy>rp{user-select:none}.mw-parser-output ruby.zy>rt{font-feature-settings:
  • 电负度电负性(英语:electronegativity,简写EN),也译作离子性、负电性及阴电性,是综合考虑了电离能和电子亲合能,首先由莱纳斯·鲍林于1932年提出。它以一组数值的相对大小表示元素原子在
  • 越共中央总书记政治主题越南共产党中央委员会总书记(越南语:Tổng Bí thư Ban Chấp hành Trung ương Đảng Cộng sản Việt Nam),1951年至1976年称第一书记(越南语:Bí thư Thứ nhất
  • 亚兹佩避孕法亚兹佩避孕法(英语:Yuzpe regimen)是一种使用炔雌醇(英语:Ethinyl estradiol)和左炔诺孕酮的紧急避孕方法。与单次大剂量左炔诺孕酮、 单次醋酸乌利司他(英语:Ulipristal acetate)、
  • 耶莱娜·扬科维奇耶莱娜·扬科维奇(塞尔维亚语:Јелена Јанковић,拉丁字母:Jelena Janković,1985年2月28日-),生于前南斯拉夫首都贝尔格莱德,塞尔维亚职业网球女运动员及联合国儿童亲善
  • 1975年春季攻势阮文绍黎笋 文进勇来源1: 1,110,000人(710,000名正规军、400,000名武装民兵部队) 1,559门火炮 2,044辆坦克和装甲车 1,556辆飞机和直升机 在4月26日: 在西贡外围:250,000人(152,0
  • 单韧穴蛤单韧穴蛤(学名:,台湾称凤凰蛤),是莺蛤目单韧穴蛤科的一种。主要分布于新加坡、印度尼西亚、中国大陆、台湾,生活在海绵动物中。
  • 帕兹·维嘉帕兹·维嘉(Paz Vega .mw-parser-output .IPA{font-family:"Charis SIL","Doulos SIL","Linux Libertine","Segoe UI","Lucida Sans Unicode","Code2000","Gentium","Gentium
  • 保罗·克列布尼科夫保罗·克列布尼科夫(英文:Paul Klebnikov,1963年6月3日-2004年7月9日)是一名美籍俄裔的记者和历史学家。他曾在《福布斯》杂志工作超过10年,去世时职位是俄文版主编。他2004年在莫