为啥用内联函数(inline functions)
在C++中函数调用需要建立栈环境,进行参数复制,保护调用现场,返回时进行返回值复制,恢复调用现场.这些操作都需要额外开销.那有啥好办法避免频繁的函数调用呢,
首先想到的可能是把函数中的代码直接拿来用,而不用先在某处弄个函数,然后再去调用,当然也只是函数比较简单时可行.但如果多处用到那函数的话,你全部替换会使得代码冗余,可读性下降,于是你想到了用宏,一些简单的函数基本上是些表达式的组合,你用个宏把它全部替换掉.这样用起来代码量会少点,可读性也强点.不过宏只是简单的替换,不会做多余的检查,比如检查函数函数是否匹配啊.这时内联函数就派上用场了.内联函数是结合了宏和函数的优点.一方面它在会把函数用函数体中的内容替换掉,这就不需要调用函数的额外开销,这像宏.另一方面它是在编译阶段而不是预编译阶段,这样编译器能做一些安全检查,比如参数类型检查啊.
内联函数用法
内联函数用法很简单,在调用函数之前先声明那函数为内联函数即可.举个简单例子
inline void Print(); //声明内联函数,当然你也可以把声明和定义放到一起,就不用在其他地方再去定义了
int main()
{
Print();
}
inline void Print() //inline关键字也可去掉
{
cout<<"this is inline function.;
}
另外据说如果函数中有while,switch等复杂控件结构,或者有递归调用.内联函数会自动失效.会当成一般函数去调用了.不过这玩艺也不太好验证.不知道啥时确实去内联了,啥时是只当一般函数处理了.
匿名函数
C#中没有内联函数的概念,不过有个比较类似的概念,叫匿名函数.
举个简单例子
delegate void MyDelegate(string name);
class Program
{
static void Print(string name)
{
Console.WriteLine("hello," + name);
}
static void Main(string[] args)
{
MyDelegate arwen = Print;
arwen("arwen");
}
}
这里用到了代理,类似于一个函数指针.当定义一个代理时要指定一个函数,我们还得另外在某个地方定义一个函数.如果函数比较简单的话我们可以不用在其他地方定义,直接就地展开,用一个匿名函数就OK.例如
MyDelegate weiwen = delegate(string name) { Console.WriteLine("hi," + name); }; //这就是匿名函数
weiwen("weiwen");
在C# 3.0中出现了拉姆达(lambda)表达式,可以把匿名方法进一步简化
MyDelegate weiwenhp = (xxx) => { Console.WriteLine("hi," + xxx);};
weiwenhp("weiwenhp");
这看着更爽吧.函数的参数可以给你推断出来,所以参数你随便用个啥东东表示下,用xxx或者yyy这些乱七八糟的都可以.
拉姆达表达式是从Lisp, Scheme等函数式编程语言里借鉴过来的东东.在C#里主要应用在Linq中.