讲讲c++ Session 2 内联(inline)函数

定义:内联函数是一种内联扩展,即通过在每个函数调用的地址插入功能代码,从而节省开销来函数调用,避免跳转到一个子程序。 inline关键字类似于宏,编译器在它被称为每个地方放置了内联函数的新副本,内联函数的运行速度比正常的函数调用快,开销都省了,但是,有一个内存问题。如果一个内联函数被调用的10次,将有10个拷贝插入到代码的函数。因此,内联函数是最好的小功能,这些功能通常被称为。一个类的成员函数,如果在类定义中定义,在默认情况下(没有必要使用inline关键字),否则,该关键字是必要的。编译器可能会忽略程序员试图内联函数。

【样例】其实还是很有用的

//函数样例

inline int max(int a, int b)
{
return (a > b) ? a : b;
}
//c++

#include <iostream.h>
int increment(int i);
void main()
{
 int i=0;
 while(i<3)
 {
  i=increment(i);
  cout<<"i is "<<i<<endl;
 }
}
//内联函数定义放在main()函数之后
inline int increment(int i)
{
 i++;
 return i;
}

【样例2,vc++的非标准用法】没人要

参考MSDN(懒得翻译了,看不懂的自己谷歌翻译)

The function or its caller is compiled with /Ob0 (the default option for debug builds).

The function and the caller use different types of exception handling (C++ exception handling in one, structured exception handling in the other).

The function has a variable argument list.

The function uses inline assembly, unless compiled with /Og, /Ox, /O1, or /O2.

The function is recursive and not accompanied by #pragma inline_recursion(on). With the pragma, recursive functions are inlined to a default depth of 16 calls. To reduce the inlining depth,
use inline_depth pragma.

The function is virtual and is called virtually. Direct calls to virtual functions can be inlined.

The program takes the address of the function and the call is made via the pointer to the function. Direct calls to functions that have had their address taken can be inlined.

The function is also marked with the naked __declspec modifier.

__forceinline is useful if:

inline or __inline is not respected by the compiler (ignored by compiler cost/benefit analyzer)

code portability is not required

inlining results in a necessary performance boost

Example of portable code:

#ifdef _MSC_VER
#define INLINE __forceinline /* use __forceinline (VC++ specific) */
#else
#define INLINE inline /* use standard inline */
#endif

INLINE void helloworld() { /* inline function body */ }

时间: 2024-10-19 21:11:26

讲讲c++ Session 2 内联(inline)函数的相关文章

内联成员函数应放在哪

今天复习C++ Primer的时候,看到了关于C++类的内联成员函数的放置,应该放在头文件中.那么这到底是为什么 呢?仅仅是一种代码规范问题还是必须这样做呢? 下面我就来讲讲我自己的理解吧.要彻底理解这个问题,首先就要了解下函数的声明和定义了.我们知道,函数可以 在多处声明,但只能在一个地方定义,不然就会出现重定义.大部分函数默认是外部链接,而inline函数默认为内部链 接.也就是说inline函数只能在本文件中使用,对其他文件是不可见的.一般我们使用某个类的时候,都是在文件中加 上该类的头文

C++如何处理内联虚函数

http://blog.csdn.net/hedylin/article/details/1775556 当一个函数是内联和虚函数时,会发生代码替换或使用虚表调用吗? 为了弄清楚内联和虚函数,让我们将它们分开来考虑.通常,一个内联函数是被展开的. class CFoo { private: int val; public: int GetVal() { return val; } int SetVal(int v) { return val=v; } }; 这里,如果使用下列代码: CFoo x

C++中的内联成员函数与非内联成员函数

在C++中内联成员函数与非内联成员函数的可以分为两种情况: 1.如果成员函数的声明和定义是在一起的,那么无论有没有写inline这个成员函数都是内联的,如下: using namespace std; class test{ public: void fuc() { cout << "ok!" << endl; } }; int main(void) { test t, t1; t.fuc(); t1.fuc(); return 0; } 或者: using n

sql server 创建内联表值函数

表值函数就是返回table 的函数使用它可以方便的进行查询的处理 创建的代码如下: create FUNCTION returunclassfirstlist(  -- Add the parameters for the function here )RETURNS TABLE ASRETURN ( -- Add the SELECT statement with parameter references here select * from classfirst;) 我们在使用创建的函数的时

内联表值函数FUNCTION

创建一个内联表值函数: 1 USE TSQLFundamentals2008; 2 IF OBJECT_ID('dbo.fn_GetCustOrders') IS NOT NULL 3 DROP FUNCTION dbo.fn_GetCustOrders; 4 GO 5 CREATE FUNCTION dbo.fn_GetCustOrders 6 (@cid AS INT) RETURNS TABLE 7 AS 8 RETURN 9 SELECT orderid, custid, empid,

内联表值函数

内联表值函数是一种可重用的表表达式,能够支持输入参数.除了支持输入参数以外,内联表值函数在其他方面都与视图相似.(可以将内联表值函数看作是一种参数化的视图,尽管没有这种正式的说法). 例: CREATE FUNCTION fn_GetCustOrders (@cid as int) RETURNS TABLE AS RETURN SELECT orderid,custid,empid,orderdate,requiredate FROM dbo.Orders WHERE [email prote

函数内联 inline,__inline,__forceinline

? 感谢大佬的总结[http://www.cnblogs.com/xuemaxiongfeng/articles/2464850.html] ● 存储限定符 __inline 与关键字 inline 的语义完全相同,不影响函数的类型,建议编译器在合理的情况下内联编译 C/C++ 函数 ● 内联减少了函数调用的开销,但却增加了代码量 ● inline 仅用于 C++,__inline和 __forceinline 用于 C/C++ ● 编译器处理内联的情况: ■ 使用 /clr 编译选项时,如果函

函数内联inline

C++语言支持函数内联,其目的是为了提高函数的执行效率(速度). 宏的优点 在C程序中,可以用宏代码提高执行效率. 编译预处理器用拷贝宏代码的方式取代函数调用,省去了参数压栈,生成汇编语言的CALL调用.返回参数.执行return等过程,从而提高了速度. 宏的缺点 1.最大缺点是容易出错,预处理器在拷贝宏代码的时候常常产生意向不到的边际效应. 2.不可调试 3.在C++中,宏代码还有另外一种缺点:无法操作类的私有数据成员. 第一种情况见下面示例: #define MAX(a,b) (a)>(b)

重构改善既有代码设计--重构手法02:Inline Method (内联函数)&amp; 03: Inline Temp(内联临时变量)

Inline Method (内联函数) 一个函数调用的本体与名称同样清楚易懂.在函数调用点插入函数体,然后移除该函数. int GetRating() { return MoreThanfiveLateDeliverise() ? 2 : 1; } bool MoreThanfiveLateDeliverise() { return _numberOfLateLiveries > 5; } int GetRating() { return _numberOfLateLiveries > 5