内联函数

内联函数(inline) ,提高效率?

匿名 (未验证) 提交于 2019-12-03 00:37:01
①当函数体比较小的时候, 内联该函数可以令目标代码更加高效. 对于存取函数以及其它 函数体比较短 , 性能关键的函数, 鼓励使用内联. ②一个较为合理的经验准则是, 不要内联超过 10 行的函数. 谨慎对待析构函数, 析构函数往往比其表面看起来要更长, 因为有隐含的成员和基类析构函数被调用! 不一定! 因为函数调用是需要开销的(函数调用时的参数压栈、栈帧开辟与销毁、以及寄存器保存与恢复等等操作),如果说函数本身的代码量比较小,比函数调用时做的准备工作的代码还要小,那此时如果使用内联的话,肯定比不使用内联的代码量还要小[2]。 不过如果函数的代码量稍大,通常还是会增加代码量的,因为内联函数是在编译阶段被编译器展开在调用处的,多次调用就需要多段重复的代码放在各个调用处。对于非内联函数,只需要保存一份函数体的代码,然后进行调用就好了。所以,在空间上,一般来说使用内联函数会导致生成的可执行文件变大。 首先,大家都知道现在计算机的存储结构,这里只考虑高速缓存到内存这一部分,从高到低,每一级的访问时间近似以成千倍甚至更高的增加。 其次,高速缓存的大小是很小的(对于我们运行的程序来说),所以我们的数据不可能都被装载到高速缓存中,这就引出了一个命中率的问题。在不命中的时候,就需要向更为下层的存储结构寻找索取目标数据,宝贵的时间也因此不断大幅增加。正如我们前面所说

C++PTA判断/选择题总结

匿名 (未验证) 提交于 2019-12-03 00:32:02
1-1 使用提取符(<<)可以输出各种基本数据类型的变量的值,也可以输出指针值。 (2分) T 1-2 预定义的插入符从键盘上接收数据是不带缓冲区的。 (2分) F 1-3 The cin stream normally is connected to the display screen. (2分) F 【cout 对象通常连接到标准输出设备,一般是显示屏】 2-1命名空间应用于: (2分) 在类外定义类的成员函数 √避免各个不同函数、变量等的名称冲突 提高代码的执行速度 以上答案都正确 2-2cout 是由I/O 流库预定义的( )。 (2分) 类 √对象 包含文件 常量 2-1 重载函数在 调用 时选择的依据中,错误的是()。 (2分) 函数的参数 参数的类型 函数的名字 √函数的类型 2-2 对定义重载函数的下列要求中,( )是错误的。 (2分) 要求参数的个数不同 要求参数中至少有一个类型不同 √要求函数的返回值不同 要求参数个数相同时,参数类型不同 1-1 函数的参数个数和类型都相同,只是返回值不同,这不是重载函数。 (1分) T 1-3The types of arguments in a function call must match the types of the corresponding parameters in the function

第二章习题

匿名 (未验证) 提交于 2019-12-03 00:32:02
一、名词解释 引用:所谓引用,就是给对象起一个别名,使用该别名可以存取该对象。换句话说,是使新的对象和原对象共用一个地址。 内联函数:内联函数是使用inline关键字声明一个函数。 重载函数:重载函数通常用来对具有相似行为而数据类型不同的操作提供一个通用的名称。 二、填空题 函数 类 (2) C++有两种注释符号,一种是 // ,另一种是 /*,,,,*/ 。 (3)使用C++风格的输入输出,在程序中必须包含头文件 iostream 。 (4) cin 是预定义的标准输入流对象, >> 是输入操作符,也称提取运算符。 (5) cout 是预定义的标准输出流对象, << 是输出操作符,也称插入运算符。 (6)指针的值是它所指向对象的 地址值 。指针的类型是它所指向对象的 类型 。指针的内容便是它所指向对象的 ֵ 。 (7)C++使用运算符 & 来定义一个引用,对引用的存取都是对它所引用的 对象 的存取。 (8)当一个函数调用出现在函数定义之前时,必须先用函数原型对函数进行 声明 。 (9)C++有 值传递 和 引用传递 两种参数传递机制。 (10)使用关键字 inline 声明的函数称为内联函数。 (11)运算符 new 用于进行动态内存分配,运算符 delete 用于释放动态分配的内存。 (12)下面程序的输出结果为 #include<iostream> using

内联函数

匿名 (未验证) 提交于 2019-12-03 00:11:01
在说内联函数之前先说说函数的调用过程: 首先调用函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要恢复现场,并按原来保存地址继续执行。也就是通常说的压栈和出栈。因此,函数调用要有一定的时间和空间方面的开销。那么对于那些函数体代码不是很大,又频繁调用的函数来说,这个时间和空间的消耗会很大。 那怎么解决这个性能消耗问题呢,这个时候需要引入内联函数了。内联函数就是在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来直接进行替换。显然,这样就不会产生转去转回的问题,但是由于在编译时将函数体中的代码被替代到程序中,因此会增加目标程序代码量,进而增加空间开销,而在时间开销上不象函数调用时那么大,可见它是以目标代码的增加为代价来换取时间的节省。 在大学里学习写C代码时,我们都学到将一些简短的逻辑定义在宏里。这样做的好处是,在编译器编译的时候会将用到该宏的地方直接用宏的代码替换。这样就不再需要象调用方法那样的压栈、出栈、传参了。性能上提升了。内联函数的处理方式与宏类似,但与宏又有所不同,内联函数拥有函数的本身特性(类型、作用域等等)。写过C++代码的应该都知道,在C++里有个内联函数,使用inline关键字修饰。另外

C++头文件

匿名 (未验证) 提交于 2019-12-03 00:01:01
C++中的头文件和源文件详解 一、C++编译模式 通常,在一个C++程序中,只包含两类文件――.cpp文件和.h文件。其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码;而.h文件则被称作C++头文件,里面放的也是C++的源代码。 C+ +语言支持“分别编译”(separate compilation)。也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里。.cpp文件里的东西都是相对独立的,在编 译(compile)时不需要与其他文件互通,只需要在编译成目标文件后再与其他的目标文件做一次链接(link)就行了。比如,在文件a.cpp中定义 了一个全局函数“void a() {}”,而在文件b.cpp中需要调用这个函数。即使这样,文件a.cpp和文件b.cpp并不需要相互知道对方的存在,而是可以分别地对它们进行编译, 编译成目标文件之后再链接,整个程序就可以运行了。 这是怎么实现的呢?从写程序的角度来讲,很简单。在文件b.cpp中,在调用 “void a()”函数之前,先声明一下这个函数“void a();”,就可以了。这是因为编译器在编译b.cpp的时候会生成一个符号表(symbol table),像“void a()”这样的看不到定义的符号,就会被存放在这个表中。再进行链接的时候,编译器就会在别的目标文件中去寻找这个符号的定义。一旦找到了

函数介绍(内联函数和函数重载)

匿名 (未验证) 提交于 2019-12-02 23:47:01
1.内联函数 2.函数重载 编译器调用函数重载时的原则: ①将所有同名函数作为候选者 ②尝试查找可行的候选函数 --通过函数名精确查找; #include <iostream> int func ( int a , int b ) { return a + b ; } int gunc ( int a , int b ) { return a + b ; } int main () { func ( 1 , 2 ); //根据函数名精确查找 return 0 ; } --通过默认参数能够匹配实参; #include <iostream> int func ( int a , int b , int c = 0 ) { return a + b ; } int func ( int a , int b ) { return a + b ; } int main () { func ( 1 , 2 ); //前两个参数匹配后,编译器还会尝试补充一个默认参数看是否有匹配 return 0 ; //项,如本例匹配到存在函数有默认参数c,则编译不通过,二次定义 }   --通过默认类型能够转换实参; #include <iostream> int func ( int a , int b , int c ) { return a + b ; } int func ( int a , int

内联函数 ―― C 中关键字 inline 用法解析

匿名 (未验证) 提交于 2019-12-02 23:34:01
1、inline函数不要超过10行代码,且不能包含循环、switch、if语句 2、在一个c文件中定义的inline函数是不能在其它c文件中直接使用,google推荐把inline函数定义在**-inl.h头文件中。 3、不要过度使用inline函数定义,尤其对大函数来说 上面三点说明如何正确的使用inline函数,我以前的时候对inline理解不透彻,使用inline的方式不正确,但现在编译器够先进,能保证错误的inline定义也可以正确编译、运行。可能会有性能的缺失。 一、什么是内联函数 下面我们来看一个例子: 二、内联函数的编程风格 1、关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。 如下风格的函数Foo 不能成为内联函数: inline void Foo(int x, int y); // inline 仅与函数声明放在一起 void Foo(int x, int y) { } 而如下风格的函数Foo 则成为内联函数: void Foo(int x, int y); inline void Foo(int x, int y) // inline 与函数定义体放在一起 { } 2、inline的使用是有所限制的 三、慎用内联 获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大