内联函数

✍ dations ◷ 2025-10-19 01:14:07 #最优化

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

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

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

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

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

相关

  • 单倍群O-M175单倍群O-M175(英语:Haplogroup O-M175)是人类Y染色体DNA单倍群之一,主要分布于东亚与东南亚,源于单倍群NO。单倍群O首次出现于距今约3万年前,出现地为东南亚或东亚,是单倍群NO-M214
  • 理中丸理中丸,源于《伤寒论》。《金匮要略》中人参汤,即将本方改作汤剂。
  • 桂冠诗人桂冠诗人(英语:Poet Laureate)是经由政府官方任命的诗人及其称号。自欧洲中古世纪,在皇帝的侍从队伍内也有诗人,他们的工作就是写下纪念某事或某节庆的诗歌,这种诗人在英国就称之
  • 衡山县衡山县地处湖南省中部偏东,为衡阳市代管县之一,因境内五岳之一的衡山而得名。县政府驻地开云镇。衡山县位于湖南省中部偏东,湘江中游地区。地处东经112o27'-112o57'、北纬26o58
  • 女部女部,为汉字索引里为部首之一,康熙字典214个部首中的第三十八个(在三划的部首中则为第九个)。在中文里,女部归于三划部首。女部通常是从上、下、左、右方均可为部字,且无其他部首
  • 铁血柔情 (1956年电影)《铁血柔情》(英文:Love Me Tender)是于1956年拍摄的一部黑白电影,由20世纪福克斯发行,为埃尔维斯·普雷斯利参演的首部电影,与电影同名的主题曲也是他的代表曲目。
  • 哈里·哈里森哈里·哈里森(Harry Harrison,1925年3月12日-2012年8月15日),美国著名科幻作家,生于美国康涅狄格州斯坦福。著名作品有《死亡世界》系列、《不锈钢老鼠》系列、《伊甸园三部曲》等
  • 塞丽娜·卡尼塞丽娜·卡尼(印尼语:Serena Kani,1999年9月7日-),印尼女子羽毛球运动员。2016年9月,塞丽娜·卡尼出战新加坡国际系列赛,与米歇尔·克里斯廷·班达索合作拿得女子双打比赛亚军;同年12
  • 林朝煌林朝煌(1969年8月17日-),为台湾的棒球选手之一,曾经效力于中华职棒俊国熊、兴农牛、统一狮及中信鲸队,守备位置为投手,但目前已经退休,并到基层担任棒球教练。粗体字为全联盟最佳或
  • 役行者灵迹札所役行者灵迹札所是修验道之开祖役行者(役小角)有渊源的三十六寺社的灵场巡礼,因役行者1300年忌日而设立。和通常的灵场巡礼相异之处在于不定札所番号。