内联函数

✍ dations ◷ 2025-12-04 02:48:54 #最优化

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

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

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

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

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

相关

  • 肺囊虫肺炎肺囊虫肺炎(Pneumocystis pneumonia)是一种单细胞真菌(yeast,在此指的是单细胞霉菌,而非酵母菌)引起的肺炎,病原体是卡氏肺囊虫(Pneumocystis jiroveci,旧名Pneumocystis carinii)
  • 生物染色剂染色是用于增强显微图像对比度的一项辅助技术。辅以不同类型的显微镜,染色和染料常在生物学和药学领域被用于提高生物组织的可见度。染色常被用于观察大块组织(如肌肉组织和结
  • 亚历珊德拉·厄巴科扬亚历山德拉·阿萨诺芙娜·埃尔巴金(俄语:Алекса́ндра Аса́новна Элбакя́н;1988年11月6日-)是一位哈萨克斯坦籍研究生、 计算机程序员以及Sci-Hub的
  • mediastinum纵膈(mediastinum)是描述胸腔中心为疏松结缔组织所包围的构造,并无一个明显的界限。本区域包含许多解剖构造,包含心脏及其周围血管系统、食道、气管、膈神经(英语:phrenic nerve)、
  • 冠醚冠醚是一种杂环有机化合物,包含有多个醚基团。最常见的冠醚就是乙撑氧的低聚物,其中重复的单位是乙烯氧基(-CH2CH2O- 可看作是环氧乙烷断裂碳氧键后的剩余基团)。这一系列中最重
  • 董同龢董同龢(1911年10月12日-1963年6月18日),中国音韵学家。生于云南昆明,祖籍江苏如皋。1932年考入国立清华大学中文系。从王力学音韵学,听课笔记被整理成王力《汉语音韵学》,毕业论文
  • 进行性肌萎缩症进行性肌萎缩(Progressive Muscular Atrophy,P.M.A)是一种具有进行性、对称性、以近端为主的弛缓性瘫痪和肌肉萎缩为特征的遗传性下运动神经元疾病。确切原因仍不清楚。有人记
  • 阿尔弗雷德·爱德华·豪斯曼阿尔弗雷德·爱德华·豪斯曼(1859年3月26日—1936年4月30日)是英国国学家和诗人,以诗歌集《什罗普郡的少年》为世人熟知。诗歌形式抒情而充满了讽刺蕴藉,诗歌期望唤起被命运掌握
  • 锅岛直茂锅岛直茂(1538年4月12日-1618年7月24日)是日本战国时代、安土桃山时代的武将,龙造寺氏的家臣。锅岛清房的次男,幼名彦法师,别名锅岛信生。在晚年更取代龙造寺氏,被丰臣秀吉允许成为
  • 光华街道 (成都市)光华街道是中华人民共和国四川省成都市青羊区所辖乡级行政区,位于青羊区中部。根据2006年的数据,辖区面积3.57平方公里,人口4万。2019年12月,青羊区调整部分街道行政区划。将光