c++ 专题一 函数的升级1

由变量中的const与define的定义 到 函数段中的 incline 的引出

注意内联函数与函数调用的区别

一、什么叫inline函数? 
inline(小心,不是online),翻译成“内联”或“内嵌”。意指:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。这样做的好处是省去了调用的过程,加快程序运行速度。(函数的调用过程,由于有前面所说的参数入栈等操作,所以总要多占用一些时间)。这样做的不好处:由于每当代码调用到内联函数,就需要在调用处直接插入一段该函数的代码,所以程序的体积将增大。拿生活现象比喻,就像电视坏了,通过电话找修理工来,你会嫌慢,于是干脆在家里养了一个修理工。这样当然是快了,不过,修理工住在你家可就要占地儿了。内联函数并不是必须的,它只是为了提高速度而进行的一种修饰。要修饰一个函数为内联型,使用如下格式: 
inline 函数的声明或定义 
简单一句话,在函数声明或定义前加一个 inline 修饰符。 
inline int max(int a, int b) 

   return (a>b)? a : b; 
}

内联函数的本质是,节省时间但是消耗空间。

二、inline函数的规则

(1)、一个函数可以自已调用自已,称为递归调用(后面讲到),含有递归调用的函数不能设置为inline;

(2)、使用了复杂流程控制语句:循环语句和switch语句,无法设置为inline;

(3)、由于inline增加体积的特性,所以建议inline函数内的代码应很短小。最好不超过5行。

(4)、inline仅做为一种“请求”,特定的情况下,编译器将不理会inline关键字,而强制让函数成为普通函数。出现这种情况,编译器会给出警告消息。

(5)、在你调用一个内联函数之前,这个函数一定要在之前有声明或已定义为inline,如果在前面声明为普通函数,而在调用代码后面才定义为一个inline函数,程序可以通过编译,但该函数没有实现inline。比如下面代码片段: 
//函数一开始没有被声明为inline: 
void foo(); 
//然后就有代码调用它: 
foo(); 
//在调用后才有定义函数为inline: 
inline void foo() 

   ...... 

代码是的foo()函数最终没有实现inline;

(6)、为了调试方便,在程序处于调试阶段时,所有内联函数都不被实现。

三、使用内联函数时应注意以下几个问题:

(1) 在一个文件中定义的内联函数不能在另一个文件中使用。它们通常放在头文件中共享。 
(2) 内联函数应该简洁,只有几个语句,如果语句较多,不适合于定义为内联函数。 
(3) 内联函数体中,不能有循环语句、if语句或switch语句,否则,函数定义时即使有inline关键字,编译器也会把该函数作为非内联函数处理。 
(4) 内联函数要在函数被调用之前声明。关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。

内联函数没有标准函数的开销,没有进栈、出栈的程序

内联函数与宏代码片段的差别:

内联函数比宏代码更加安全,因为编译器会对内联函数进行检查,然后不会对宏代码进行检查。

c++符号表:c++自己用的东西,与最终生成的程序没有任何的关系

时间: 2024-08-07 21:17:52

c++ 专题一 函数的升级1的相关文章

[Python学习] 专题一.函数的基础知识

        最近才开始学习Python语言,但就发现了它很多优势(如语言简洁.网络爬虫方面深有体会).我主要是通过<Python基础教程>和"51CTO学院 智普教育的python视频"学习,在看视频中老师讲述函数知识的时候觉得非常不错,所以就写了第一篇Python学习的文章分享给大家.主要内容:         1.Python安装与基本输入输出,print()函数和raw_input()函数简单用法. 2.我根据视频中学到的知识,讲解函数的基本知识: (1).系统提

c++函数的升级_4

一 .常量和宏回顾 1. C++中的const常量可以替代宏常数定义 如:const int A =3  -> #define A 3  C++中是否有解决方案替代宏代码片段 二.内联函数 1. C++中推荐使用内联函数替代宏代码片段 2. C++中使用 inline 关键字声明内联函数 inline int func(int a ,int b ) { return a < b ?a : b; } 内联函数必须与函数定义结合在一起,否则编译器就会直接忽略内联请求. 3.C++编译器可以将一个函

C++函数的升级下_5

一.重载(Overload) 1.同一个标识符在不同的上下文有不同的意义 如:"洗"不同的含义 - 洗衣服.洗脸.洗脑 如:"play"和不同的单词搭配后不同的含义 -play chess, play piano 2.函数重载(Function Overload) a.用同一个函数名定义不同的函数 b.当函数名和不同的参数搭配时函数的含义不同 int func(int x) int func (int a, int b ) int func(const char*

ajax_封装函数_升级_传递多个参数和传递一个参数

HTML: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>title</title> </head> <body> <h2>测试工具函数</h2> <input class='get' type="button" value

专题一.函数的基础知识

https://blog.csdn.net/Eastmount/article/details/39088881 ###主要内容: 1.Python安装与基本输入输出,print()函数和raw_input()函数简单用法. 2.我根据视频中学到的知识,讲解函数的基本知识: (1).系统提供内部函数:字符串函数库.数学函数库.网络编程函数库.OS函数库 (2).第三方提供函数库:讲解如何安装httplib2第三方函数库,再做了个简单的网页爬虫例子 (3).用户自定义函数:讲解无返回类型.有形参.

模板专题:函数模板

第一个例子:比较两个数值的大小(整型.浮点型等) template<class T> T TSWAP(T a, T b) { return a > b ? a : b; } int main() { cout << TSWAP(9, 20) << endl; /*cout << TSWAP<int>(9, 20) << endl;*//*也可行;*/ cout << TSWAP(9.5, 6.3) <<

C++拾遗--bind函数绑定

C++拾遗--bind函数绑定 前言 函数绑定bind函数用于把固定的参数与已知的函数进行绑定,形成新的函数,从而减少参数的个数,降低函数的调用难度.需要指出:bind就是函数适配器. bind函数 实例 #include <iostream> #include <functional> using namespace std; using namespace std::placeholders; int main() { auto fun = [](int *array, int

[Python学习] 专题二.条件语句和循环语句的基础知识

        前面讲述了"专题一.函数的基础知识",而这篇文章讲述的Python的条件语句和循环语句的基础知识.主要内容包括: 1.条件语句:包括单分支.双分支和多分支语句,if-elif-else 2.循环语句:while的使用及简单网络刷博器爬虫 3.循环语句:for的使用及遍历列表.元组.文件和字符串 前言: 语句块         在讲诉条件语句.循环语句和其他语句之前,先来补充语句块知识.(前面讲函数时已经用到过) 语句块并非一种语句,它是在条件为真(条件语句)时执行或执行

chapter22:源码与Tarball之(3)-函数库的管理

一.函数库的两种类型 (1)静态函数库 扩展名为libxxx.a 在编译的时候整合到执行程序中.所以文件会相对比较大. 可以独立执行. 如果函数库升级,则整个程序都要重新编译. (2)动态函数库 扩展名为libxxx.so 可执行文件在要用到函数库的时候才去读取,文件相对小些. 不能独立执行.函数库的目录也不能改变. 函数库升级后,可执行文件不用重新编译.所以升级方便. 目前Linux distribution一般使用动态函数库,因为升级方便.大多数函数库放在/usr/lib, /lib下面,还