C++编程思想学习——内联函数

来源:互联网 发布:西安百度自然排名优化 编辑:程序博客网 时间:2024/05/21 05:36

1、预处理器的缺陷

      预处理器的宏虽然降低了函数调用的额外开销,使用宏也表面上好像是使用函数一样。但是,使用宏时可能在预处理器的展开后,表达式的优先级,以及表达式展开后的多次求值可能使我们的程序获得的结果并不是我们所要求的,特别是将宏当做函数一样使用时。由于宏存在这样的缺点,但是,为了效率,所以,产生了内联函数。内联函数几乎具有函数的一切行为,但是却不需要函数调用的开销。

2、内联函数

      内联函数定义一般放在头文件中,这样编译器看到定以后就会将其放到符号表中。当使用函数时就可以检查函数的使用及其类型是否正确。默认在类内部定义的函数为内联函数。同时,也可以在非类的内部的函数前加inline关键字将其变为内联函数。由于,内联函数为内部连接,所以,内联函数的声明和定义一般是在一个文件内。内联函数适合函数体较小的功能实现。如果,函数较大则会产生代码膨胀,会降低效率。

      内联函数的一个主要使用就是用作类内部的修改器和访问器。

3、内联函数和编译器

当调用一个内联函数时编译器对函数的正确性检查完毕后将内联函数放入符号表(包括内联函数的函数体)。

但是,如果内联函数的代码过大、过长时编译器将会将内联函数当做普通函数处理,不做内联。同样,如果程序中要去内联函数的地址时,编译器也会为内联函数分配存储空间,将内联函数当做普通函数处理,当地址不用时编译器又将内联函数正常使用。

      内联函数在一个类中引用可以引用一个还未在类中声明的函数。因为C++规定只有在类生命结束后,其中的内联函数才会被计算。

构造函数和析构函数一般为内联函数,但是,在构造函数和析构函数中可能会隐藏行为,因为,类中可能包含子对象,子对象的构造函数和析构函数必须在父对象的构造函数中被调用。这些子对象可以是成员对象,或者是由于继承而存在。所以,有些构造函数和析构函数也不应该是内联函数。

但是,为了减少类的接口的混乱,最好将内联函数的定义放在类的外面。然后用inline关键词来优化。

但是,因为内联简单所以,内联函数也许在类的定义里被多次使用,程序设计者都会这样做。后来如果想让程序规模减少时,可以将内联函数移出内联,这不会影响程序的功能。程序设计的原则是:先让程序跑起来,然后才是优化。

“##”它允许两个标识符并它们粘贴在一起自动产生一个新的标识符。

    本文为个人学习C++编程思想时个人心得体会,所以,难免有不严谨之处,甚至有可能是错误的理解。如发现错误,或者疑问。欢迎提出讨论,共同学习、进步。