内联函数

✍ dations ◷ 2025-04-28 07:24:05 #最优化

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

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

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

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

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

相关

  • 梭温梭温(缅甸语:စိုးဝင်း,缅甸语委转写:Soe Win;1947年6月14日-2007年10月12日),缅甸前总理,自2004年10月19日起担任,由军人政府最高领导人丹瑞委任,据报导,他与丹瑞关系密切。梭温
  • span style=color: white;外长/span本文是 欧洲联盟的政治与政府 系列条目之一欧盟外交与安全政策高级代表 (英语:High Representative of the Union for Foreign Affairs and Security Policy) 是欧盟共同外交
  • 固定汇率制固定汇率制(又称钉住汇率制),是国家间货币采用固定汇率进行货币交换的制度,一国政府可通过行政方式限定其货币相对于另一货币的价值。该国政府依照一定重量的黄金,或者一定量的另
  • 连山区连山区是辽宁省葫芦岛市下辖的一个市辖区。1988年锦西市改为省辖市,同时析原锦西市部分地置连山区。1994年属葫芦岛市。2011年9月13日,辽宁省政府《关于葫芦岛市部分行政区划
  • 戈特霍尔德·埃弗拉伊姆·莱辛戈特霍尔德·埃弗拉伊姆·莱辛(Gotthold Ephraim Lessing,1729年1月22日生于德国卡门茨—1781年2月15日卒于德国布伦瑞克)是德国启蒙运动时期最重要的作家和文艺理论家之一,他的
  • 乌鲁汝—卡塔曲塔国家公园乌鲁汝-卡塔曲塔国家公园(英文:Uluṟu-Kata Tjuṯa National Park)是位于澳大利亚北领地的南部的一个国家公园,在1981年被列入世界自然遗产。乌鲁汝-卡塔曲塔国家公园内最著名的地
  • 志贺洁志贺洁(1871年2月7日-1957年1月25日)日本知名医学家与细菌学家,,生于江户时代陆前国宫城郡仙台(今宫城县仙台市),也是志贺杆菌的发现者。志贺洁出身于仙台藩藩士的家中,原名佐藤直吉,
  • TestNGTestNG是一个Java语言的测试框架,由Cédric Beust受到JUnit和NUnit(英语:NUnit)的启发而创建。TestNG的设计目标是,覆盖更广泛的测试类别范围:单元测试、功能测试、端到端测试、集
  • 这不是斯巴达《这不是斯巴达》(英语:)是2008年恶搞《斯巴达300勇士》的电影,由杰森·佛雷和艾伦·赛兹(Aaron Seltzer)联合执导。性质相似于《惊声尖笑》、《史诗电影》和《约会电影》等嘲讽类
  • 内贡博内贡博(僧伽罗语:මීගමුව,转写:Mīgamuva、泰米尔语:நீர்கொழும்பு,转写:Nīrkoḻumpu)是斯里兰卡一座主要城市,位于斯里兰卡岛西岸西部省和内贡博潟湖湖口。在2019