内联函数

C/C++中的const、static、inline、friend、template、virtual、异常机制等特性

徘徊边缘 提交于 2020-01-11 07:16:46
一、const const关键字的作用 (1)作用: 1)欲阻止一个变量被改变,可使用const,在定义该const变量时,需先初始化,以后就没有机会改变他了; 2)对指针而言,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const; 3)在一个函数声明中,const可以修饰形参表明他是一个输入参数,在函数内部不可以改变其值; 4)对于类的成员函数,有时候必须指定其为const类型,表明其是一个常函数,不能修改类的成员变量; 5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。 const修饰变量 变量的值不能改变 const修饰指针 如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量 如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量 指针常量:不能通过指针来修改变量的值。 常量指针:一直指向该变量,不能给该指针赋予其他地址 函数中使用const const修饰函数参数 表示参数不可变 若参数为引用,可以增加效率 const引用传递和函数按值传递的效果是一样的,但按值传递会先建立一个类对象的副本, 然后传递过去,而它直接传递地址,所以这种传递比按值传递更有效 const按值传递时只是外部对象的拷贝,值的改变不会对外部有什么影响

内联函数的用途

孤街浪徒 提交于 2020-01-07 07:57:42
我们使用函数的目的是为了避免重复制造轮子,也就是为了避免重复写相同的代码。凡事有利有弊,使用函数固然课以优化我们的代码,但却增加了开销,因为每一次调用函数的过程中都会消耗内存,就会为函数分配一个栈,并且调用函数本身也会花费一些时间,并在计算机底层做一些工作(保护原来的工作环境,进入了新的执行环境)。那么我们的解决方案是使用内联函数。 内联函数实在执行函数过程中遇到函数名时不返回调用函数,而是在函数名所在地写上函数的代码。举个例子: #include <iostream> #include <Windows.h> void test(int n); int main (void){ int number; printf("请输入您想打印的数的个数:"); scanf("%d",&number); for(int i=0;i<number;i++ ){ test(i+1); } system("pause"); return 0; } void test(int n){ printf("%d\n",n); } 显然这个函数想要实现的功能非常简单,但是次数较多,当n的值较大时,for循环每一次返回调用函数都要消耗一定的栈空间,printf("%d\n",n);可能只要1ms,但返回调用函数却要10ms,这样子时很亏的。但是使用内联函数却可以解决这个问题: #include

内联函数的用途

一曲冷凌霜 提交于 2020-01-05 11:18:44
我们使用函数的目的是为了避免重复制造轮子,也就是为了避免重复写相同的代码。凡事有利有弊,使用函数固然课以优化我们的代码,但却增加了开销,因为每一次调用函数的过程中都会消耗内存,就会为函数分配一个栈,并且调用函数本身也会花费一些时间,并在计算机底层做一些工作(保护原来的工作环境,进入了新的执行环境)。那么我们的解决方案是使用内联函数。 内联函数实在执行函数过程中遇到函数名时不返回调用函数,而是在函数名所在地写上函数的代码。举个例子: #include <iostream> #include <Windows.h> void test(int n); int main (void){ int number; printf("请输入您想打印的数的个数:"); scanf("%d",&number); for(int i=0;i<number;i++ ){ test(i+1); } system("pause"); return 0; } void test(int n){ printf("%d\n",n); } 显然这个函数想要实现的功能非常简单,但是次数较多,当n的值较大时,for循环每一次返回调用函数都要消耗一定的栈空间,printf("%d\n",n);可能只要1ms,但返回调用函数却要10ms,这样子时很亏的。但是使用内联函数却可以解决这个问题: #include

C++类的成员变量和成员函数的介绍

此生再无相见时 提交于 2019-12-29 04:50:44
类可以看做是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型。类这种数据类型是一个包含成员变量和成员函数的集合。 类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存。但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类型或者说是一种模板,本身不占用内存空间,而变量的值则需要内存来存储。 类的成员函数也和普通函数一样,都有返回值和参数列表,它与一般函数的区别是:成员函数是一个类的成员,出现在类体中,它的作用范围由类来决定;而普通函数是独立的,作用范围是全局的,或位于某个命名空间内。 上节我们在示例中给出了 Student 类的定义 ,如下所示: class Student { public : //成员变量 char *name ; int age ; float score ; //成员函数 void say () { cout <<name << "的年龄是" <<age << ",成绩是" <<score <<endl ; } } ; 这段代码在类体中定义了成员函数。你也可以只在类体中声明函数,而将函数定义放在类体外面,如下图所示: class Student { public : //成员变量 char *name ; int age ; float score ; //成员函数 void say (); //函数声明 } ; /

C++内联函数(Inline)介绍

余生长醉 提交于 2019-12-26 06:14:55
   文章摘自—— http://www.yesky.com/221/204721.shtml 介绍内联函数之前,有必要介绍一下预处理宏。内联函数的功能和预处理宏的功能相似。相信大家都用过预处理宏,我们会经常定义一些宏,如 #define TABLE_COMP(x) ((x)>0?(x):0)   就定义了一个宏。   为什么要使用宏呢?因为函数的调用必须要将程序执行的顺序转移到函数所存放在 内存 中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。   但是宏也有很多的不尽人意的地方。   1、.宏不能访问对象的私有成员。   2、.宏的定义很容易产生二意性。   我们举个例子: #define TABLE_MULTI(x) (x*x)   我们用一个数字去调用它,TABLE_MULTI(10),这样看上去没有什么错误,结果返回100,是正确的,但是如果我们用TABLE_MULTI(10+10)去调用的话,我们期望的结果是400,而宏的调用结果是(10+10*10+10),结果是120

C++内联函数(Inline)介绍

為{幸葍}努か 提交于 2019-12-26 06:14:38
介绍内联函数之前,有必要介绍一下预处理宏。内联函数的功能和预处理宏的功能相似。相信大家都用过预处理宏,我们会经常定义一些宏,如 #define TABLE_COMP(x) ((x)>0?(x):0) 就定义了一个宏。   为什么要使用宏呢?因为函数的调用必须要将 程序 执 行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记 忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。而宏只是在预处理的地方 把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。   但是宏也有很多的不尽人意的地方。   1、.宏不能访问对象的私有成员。   2、.宏的定义很容易产生二意性。   我们举个例子: #define TABLE_MULTI(x) (x*x)   我们用一个数字去 调用它,TABLE_MULTI(10),这样看上去没有什么错误,结果返回100,是正确的,但是如果我们用TABLE_MULTI(10+10)去调 用的话,我们期望的结果是400,而宏的调用结果是(10+10*10+10),结果是120,这显然不是我们要得到的结果。避免这些错误的方法,一是给 宏的参数都加上括号。 #define

内联函数和宏

跟風遠走 提交于 2019-12-26 06:14:20
1. 内联函数和宏: 内联扩展是用来消除函数调用时的时间开销。它通常用于频繁执行的函数。一个小内存空间的函数非常受益。那么内联函数和宏之间有什么关系呢?? 实际上,内联函数的功能和预处理宏的功能相似。我们会经常定义一些宏,如 #define TABLE_COMP(x) ((x)>0?(x):0)这就定义了一个宏。看看为什么要使用宏?因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。这些和内联函数的优点是一样的哦!   但是宏也有很多的不尽人意的地方。   1.宏不能访问对象的私有成员。   2.宏的定义很容易产生二意性。 举个例子: #define TABLE_MULTI(x) (x*x)   我们用一个数字去调用它,TABLE_MULTI(10),这样看上去没有什么错误,结果返回100,是正确的,但是如果我们用TABLE_MULTI(10+10)去调用的话,我们期望的结果是400,而宏的调用结果是(10+10*10+10),结果是120

内联函数与宏--小结

百般思念 提交于 2019-12-26 06:13:57
第一部分:宏 为什么要使用宏呢? 因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此, 函数调用要有一定的时间和空间方面的开销,于是将影响其效率。 而 宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率 。 但是宏也有很多的不尽人意的地方。 1、宏不能访问对象的私有成员。 2、宏的定义很容易产生二意性。  我们举个例子:    #define TABLE_MULTI(x) (x*x)   我们用一个数字去调用它,TABLE_MULTI(10),这样看上去没有什么错误,   结果返回100,是正确的,但是如果我们用TABLE_MULTI(10+10)去调用的话,   我们期望的结果是400,而宏的调用结果是(10+10*10+10),结果是120,这显   然不是我们要得到的结果。避免这些错误的方法,一是给宏的参数都加上括号。   #define TABLE_MULTI(x) ((x)*(x))   这样可以确保不会出错,但是,即使使用了这种定义,这个宏依然有可能   出错,例如使用TABLE_MULTI(a++)调用它,他们本意是希望得到(a+1)*

宏与内联函数

笑着哭i 提交于 2019-12-26 06:13:35
第一部分:宏 为什么要使用宏呢? 因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。 而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。 但是宏也有很多的不尽人意的地方。 1、宏不能访问对象的私有成员。 2、宏的定义很容易产生二意性。 我们举个例子: #define square(x) (x*x) 我们用一个数字去调用它,square(5),这样看上去没有什么错误,结果返回25,是正确的,但是如果我们用squre (5+5)去调用的话,我们期望的结果是100,而宏的调用结果是(5+5*5+5),结果是35,这显然不是我们要得到的结果。避免这些错误的方法,一是给宏的参数都加上括号。 #define square(x) ((x)*(x)) 第二部分:内联函数 从上面的阐述,可以看到宏有一些难以避免的问题,怎么解决呢? 内联函数是代码被插入到调用者代码处的函数。如同 #define 宏,内联函数通过避免被调用的开销来提高执行效率,尤其是它能够通过调用(“过程化集成”)被编译器优化。

宏定义和内联函数区别

ぃ、小莉子 提交于 2019-12-26 06:13:14
   内联函数是代码被插入到调用者代码处的函数。如同 #define 宏,内联函数通过避免被调用的开销来提高执行效率,尤其是它能够通过调用(“过程化集成”)被编译器优化。 宏定义不检查函数参数,返回值什么的,只是展开,相对来说,内联函数会检查参数类型,所以更安全。   内联函数和宏很类似,而区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。   声明内联函数看上去和普通函数非常相似: void f(int i, char c);   当你定义一个内联函数时,在函数定义前加上 inline 关键字,并且将定义放入头文件: inline void f(int i, char c) { // ... } 任何在类的说明部分定义的函数都会被自动的认为是内联函数。 内联函数必须是和函数体申明在一起,才有效。像这样的申明Inline Tablefunction(int I)是没有效果的,编译器只是把函数作为普通的函数申明,我们必须定义函数体。 Inline tablefunction(int I) {return I*I}; 这样我们才算定义了一个内联函数