内联函数

✍ dations ◷ 2025-12-08 23:50:51 #最优化

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

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

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

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

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

相关

  • 植被植被是地球表面所覆盖的植物的总称。它是一个植物学、生态学、农学和地球科学的名词。植被可以因为生长环境的不同而被分类,譬如高山植被、草原植被、海岛植被等。环境因素如
  • 风阻阻力系数(常表示为 C d
  • 下士下士是一种军衔,在中华民国国军军衔制度中,下士为士官的最低阶,下士之下的阶级为上等兵,下士之上的阶级为中士,在军队中通常担任班长或副班长职务。中华民国的士官(包含士兵)共分九
  • 玛利亚希尔夫玛利亚希尔夫(Mariahilf)是奥地利首都维也纳的第六区,位于内城区西南侧,1850年成立。面积1.48平方公里,人口29523人。该区人口密集,有许多住宅楼宇。。自19世纪末以来,发展为重要的
  • 吴语白话文吴语白话文属汉语白话文的一种,是一种以吴语口语为语法和词汇基础、以汉字为书写文字的汉语书写体系。以苏白为代表。豆棚闲话弹词脚本“沈氏四种”(《报恩缘》、《才人福》、
  • 基础学科拔尖学生培养试验计划基础学科拔尖学生培养试验计划,一度冠以“珠峰计划”的代号,由中华人民共和国教育部2009年底开始实施,目的就是培养拔尖创新人才。这项计划是由中央专项直接拨款来支持入选研究
  • 2月22日2月22日是公历一年中的第53天,离全年结束还有312天(闰年则还有313天)。
  • 铁卫团铁卫团(罗马尼亚语:Garda de fier),是在1927年至1941年间罗马尼亚的一个极右组织。铁卫团的意识形态包括民族主义、法西斯主义、反犹太主义、反共主义等。在扬·安东内斯库上台
  • 浊齿无咝塞擦音浊齿无咝塞擦音是一种辅音,被使用于一些口语中。国际音标写作⟨d͡ð⟩、⟨d͜ð⟩、⟨d̪͡ð⟩或⟨d̟͡ð⟩。此音常常是/ð/的同位异音。浊齿无咝塞擦音的特征包括:当符号
  • 仁川国际机场1号航站楼站仁川国际机场1号航站楼站(朝鲜语:인천공항1터미널역/仁川空港1터미널驛  */?)位于韩国仁川广域市中区、属于仁川国际机场铁道与仁川机场磁悬浮线的铁路车站,位于仁川国际机场交