内联函数

内联函数分析

大城市里の小女人 提交于 2019-11-29 13:51:18
目录 1. 内联函数的声明 2. 内联函数的特性 3. 内联函数与编译器 4. 内联函数的限制 1. 内联函数的声明 在C++中,const常量可以代替宏常数定义,而宏代码段则推荐使用内联函数来代替。 C++中使用 inline 关键字声明内联函数 inline只是一种请求,编译器不一定允许这种请求 inline关键字必须和函数定义结合在一起 ,否则编译器会直接忽略内联请求 inline int func(int a, int b) { return a < b ? a : b; } 2. 内联函数的特性 C++编译器直接将 内联函数的函数体扩展到函数调用的地方 内联函数调用时 没有压栈、跳转、返回等额外开销 内联函数 具有参数检查、返回类型等普通函数特征 内联函数与宏代码段相比,保留了比普通函数效率更高、开销更小的优点,摒弃了宏代码段不经过编译器可能带来副作用的缺点 #include <stdio.h> #define MAX(a, b) ((a) < (b) ? (a) : (b)) inline int max(int a, int b) { return a < b ? a : b; } int main(int argc, char *argv[]) { int a1 = 1; int b1 = 3; int c1 = MAX(++a1, b1); int a2 = 1;

<<C++ Primer>> 第 6 章 函数

孤街浪徒 提交于 2019-11-29 06:44:30
术语表 第 6 章 函数 二义性调用(ambiguous call): 是一种编译时发生的错误,造成二义性调用的原因时在函数匹配时两个或多个函数提供的匹配一样好,编译器找不到唯一的最佳匹配。 实参(argument): 函数调用时提供的值,用于初始化函数的形参。 Assert: 是一个预处理宏,作用于一条表示条件的表达式。当未定义预处理遍历NDEBUG时,assert对条件求值。如果条件为假,输出一条错误信息并终止当前程序的执行。 自动对象(automatic object): 仅存在于函数执行过程中的对象。当程序的控制流经过此类对象的定义语句时,创建该对象;当到达了定义所在的块的末尾时,销毁该对象。 最佳匹配(best match): 从一组重载函数中为调用选出的一个函数。如果存在最佳匹配,则选出的函数与其他所有可行函数相比,至少在一个实参上时更优的匹配,同时在其他实参的匹配上不会更差。 传引用调用(call by reference): 参见引用传递。 传值调用(call by value): 参见值传递。 候选函数(candidate function): 解析某次函数调用时考虑的一组函数。候选函数的名字应该与函数调用使用的名字一致,并且在调用点候选函数的声明在作用域之内。 constexpr: 可以返回常量表达式的函数,一个constexpr函数被隐式地声明成内联函数。

c++内联函数

空扰寡人 提交于 2019-11-29 06:15:53
内联函数inline: 引入内联函数的目的是为了解决程序中函数调用的效率问题,这么说吧,程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换,而对于其他的函数,都是在运行时候才被替代。这其实就是个空间代价换时间的i节省。所以内联函数一般都是1-5行的小函数。在使用内联函数时要留神: 1.在内联函数内不允许使用循环语句和开关语句; 2.内联函数的定义必须出现在内联函数第一次调用之前; 3.类结构中所在的类说明内部定义的函数是内联函数。 来源: https://www.cnblogs.com/cqu-qxl/p/11458601.html

构建之法读书笔记 第4章 两人合作

回眸只為那壹抹淺笑 提交于 2019-11-29 02:33:23
代码规范 一个人独立完成的软件已经很少见了(向独立游戏开发者致敬),软件都是在相互合作中完成的,最小单位: 俩人。 代码规范: 不同的人对代码好坏评判不同,需要基准 代码风格规范 文字上的规定,很重要 原则: 简明易读,无二义性 命名上应该一眼看出变量的类型和语义 匈牙利命名法: 给变量以有意义的前缀。对于强类型的语言不必要 Pascal: 所有单词首字母大写 Camel: 第一个单词小写,其余单词遵循Pascal 函数: 动词或者动宾来组合 注释 复杂的注释应该放在函数头 注释应该只用ASCII码 误导的注释比没有注释更糟糕 避免冗余的注释 代码设计规范 通用原则上的规范,牵涉模块关系等 函数 只做一件事,并且做好 goto 函数最好有单一的出口,为达此目的,可以使用goto ??以前都是听说要避免使用goto 错误处理 验证参数正确性 使用Assert 如何处理C++中的类 类的使用 使用类来封装面向对象的概念和多态 指针传递,避免传递实体的值 对于有显式构造和析构函数的类,避免建立全局的实体,因为不知道何时创建和消除 仅在必要时使用类 仅数据的封装,用struct即可 仅在必要时使用类型继承 关于数据成员和方法 按照public, protected, private 的顺序来说明类中的成员 使用虚函数来实现多态;仅在很有必要时使用虚函数;若一个类型要实现多态

C++基础--inline

删除回忆录丶 提交于 2019-11-29 01:40:24
内联函数的定义:   在函数返回类型前加上inline关键字可以将函数指定为内联函数。 内联函数和普通函数的区别:   当编译器处理调用内联函数的语句时,不会将该语句编译成函数调用的指令,而是直接将整个函数体的代码插人调用语句处。 内联函数的优点:   内联函数可以避免频繁调用函数的开销。 内联函数的缺点:   增加了函数的体积。 所以当函数体代码较长或者存在循环时须慎用内联。否则只会消耗更多的内存,适得其反。 内联函数应该在头文件中定义,且当在头文件中加入或修改内联函数,使用该头文件的函数都需要重新编译。 内联函数和普通函数的区别在于:   当编译器处理调用内联函数的语句时,不会将该语句编译成函数调用的指令,而是直接将整个函数体的代码插人调用语句处。 inline int testFunction(int a, int b) { return (a>b?a:b); } int main() { cout<<testFunction(3,9)<<endl; //展开为cout<<a>b?a:b<<endl; return 0; } 来源: https://www.cnblogs.com/slwang-27921804/p/11437934.html

inline函数

一个人想着一个人 提交于 2019-11-28 18:44:18
Inline函数特征: 相当于把内联函数里面的内容写在调用内联函数处; 相当于不用执行进入函数的步骤,直接执行函数体; 相当于宏,却比宏多了类型检查,真正具有函数特性; 编译器一般不内联包含循环、递归、switch 等复杂操作的内联函数; 在类声明中定义的函数,除了虚函数的其他函数都会自动隐式地当成内联函数。 优缺点    优点 内联函数同宏函数一样将在被调用处进行代码展开,省去了参数压栈、栈帧开辟与回收,结果返回等,从而提高程序运行速度。 内联函数相比宏函数来说,在代码展开时,会做安全检查或自动类型转换(同普通函数),而宏定义则不会。 在类中声明同时定义的成员函数,自动转化为内联函数,因此内联函数可以访问类的成员变量,宏定义则不能。 内联函数在运行时可调试,而宏定义不可以。    缺点 代码膨胀。内联是以代码膨胀(复制)为代价,消除函数调用带来的开销。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。 inline 函数无法随着函数库升级而升级。inline函数的改变需要重新编译,不像 non-inline 可以直接链接。 是否内联,程序员不可控。内联函数只是对编译器的建议,是否对函数内联,决定权在于编译器 虚函数(virtual)可以是内联函数(inline)吗?

7.宏与内联函数

大城市里の小女人 提交于 2019-11-28 16:22:24
作用:减少函数调用需要的开销,提高函数调用时的程序执行效率。 宏: 宏是C++ 编译预处理 系统处理的实体。 宏定义的4种格式: 1) #define <宏名> <文字串> 在编译前进行使用文字串进行宏替换 #define PI 3.14 2) #define <宏名>(<参数表>) <文字串> 在编译前进行使用文字串进行宏替换 #define max(a,b) a>b?a:b 3)#define <宏名> #ifdef OUTPUTFILE //输出到文件的代码 #endif 4) #undef <宏名> 用于取消宏名的编译 不足:1)重复计算,如max((x+1),(y+2)),因为其只是进行单纯的文字替换 2)不进行参数类型检查和转换 内联函数: 在函数定义中的返回值类型之前加上一个关键字 inline 其作用是 建议(具体有没有不一定,有些函数加上也不会作为内联函数对待,如递归函数) 编译程序把该函数的函数体展开到调用点,这样就避免了函数调 用的开销,从而提高了函数调用的效率。 如: inline int max(int a,int b) {return a>b?a:b;} 来源: https://www.cnblogs.com/tuzi140301/p/11415265.html

C++基础-函数

怎甘沉沦 提交于 2019-11-28 16:19:42
1. 函数简介 1.1 函数参数与参数传递 在C++语言中函数有两种传参的方式: 传值和传址 。 以传值方式, 在函数调用过程中会生成临时变量用形参代替,并把实参的值传递给新分配的临时变量即形参。 但 在函数调用结束后,实参不会跟随形参而改变。 如果要改变实参的值, 只能通过指针传递。如果函数是“只读函数”,为了防止数据/地址传递增加破坏数据的风险,需要在形参中增加const标识符来解决。 1.2 函数的递归 递归常用于重复性的程序当中。 在递归中,每次递归调用都会创建自己的一套变量,保存在不同的地址空间当中 。如下所示,可以用栈的入栈和出栈来表示递归。 void countdown(int n){ cout<<"Counting down ..."<<n<<" (Address at "<<&n<<")"<<endl; if(n>0) countdown(n-1); cout<<n<<" Up"<<" (Address at "<<&n<<")"<<endl; } int main(){ countdown(5); //递归调用 } 该递归的运行结果为: 1.3 内联函数 inline 函数的调用在执行时,虽然可以减少可执行程序的体积,但也会带来程序运行时间上的开销 。但是,如果一个函数内部没有几条语句,执行时间本来就非常短,那么这个函数调用产生的额外开销和函数本身执行的时间相比

成员函数与内联函数

╄→尐↘猪︶ㄣ 提交于 2019-11-28 12:30:11
11. 关于成员函数特征的下列描述中, ______是错误的. 成员函数一定是内联函数 B. 成员函数可以重载 C. 成员函数可以设置缺省参数值 D. 成员函数可以是静态的 [A] [解析] 因为成员函数可以在类体内定义,也可以在类体外定义,所以成员函数不一定都是内联函数;成员函数可以重载,可以设置参数的默认值,成员函数可以是静态的。 内联函数 是指在调用衣柜函数时,不把他当作调用而处理,而是把这个函数的代码直接在调用他的函数里展开的形式,也可以理解为内联函数就相当于一段代码。不需要调用,效率就高些。成员函数是类中声明的函数,属于类。当然如果在类中定义的成员函数自动变为内联函数。 成员函数是属于对象的, 静态函数才是属于类的. 如果在类体内定义的函数,则会被编译器默认为 内联函数 , 如果把函数的定义放在外面,且在函数的声明的时候加上关键字inline,则函数变为 内联函数 ,否则为成员函数. 内联函数类似于C里边的宏,只是宏经常有一些不安全因素,比如 宏定义 add() 是 a+b,调用的时候宏定义直接展开,不做任何的判断,如果调用res = add()*c; 得到的代码就是res = a+b*c;不是想要的结果。 内联函数 可以理解成一个安全的宏定义,他就是一个真正的函数,只是 不用压栈出栈,速度快,而且比宏定义安全,所以 利用 短且频率

C语言的内联函数的作用

主宰稳场 提交于 2019-11-28 10:44:30
   view plain copy关内联函数键字inline    view plain copyvoid myprintf(int a)   {   priintf(“%d”,a);   }   int main()   {   for(i=0;i《100;i++)   myprintf(3);   }   对于这个函数,在进行反复的打印3的过程中我们是不是要反复的调用myprintf(int a)这个函数,进函数和出函数是需要时间的,假设这个过程用时为4ms,而执行printf这个操作只需要2ms,那么在100次循环的过程中进出函数的时间比函数功能printf需要的时间还要长,这样很影响工作效率。于是,我们就想要如何去免去进出函数的过程呢?那么就可以声明inline这个关键字,有何用途?当我们声明了一个inline的函数时候,函数被调用的语句就被替换成了函数本身,进行了一个预处理 view plain copyint main()   {   for(i=0;i《100;i++)   void myprintf(3)   {   printf(“%d”,3);   }   return 0;   }   这样一来我就非常明显的知道这个函数是干什么的了,就不需要去调用函数的定义部分,再通俗点讲,原来我要从家里去外面的商店去买冰淇淋(来回需要时间),现在商店就在我家里面了