内联函数

函数调用是由时间开销的,首先参数入栈,函数返回地址入栈,执行完后从栈中取出返回地址,然后再跳转到返回地址。如果函数本身比较长,那么这个开销就会比较小。但是如果函数较短且执行多次,这个开销就被放大了。

为了减小函数的额外开销,引入了内联函数的机制,编译器在编译时会直接把整个函数插入到调用语句处,而不会产生调用函数的语句。

C / C++ 是追求极致效率的语言

使用

在函数定义前,加上inline就可以定义了

Example:

code

int c[50];

inline int mmax1(int a,int b){
    for(int i=0;i<50;i++)
        c[i] = i;

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

int mmax2(int a,int b){
    for(int i=0;i<50;i++)
        c[i] = i;    

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


int main(){
    time_t begin_time = clock();
    for(int i=1;i<=10000;i++)
        for(int j=1;j<=100000;j++)
            mmax1(i,j);
    time_t finish_time = clock();
    double tot_time = (finish_time-begin_time)/CLOCKS_PER_SEC;
    printf("cost time with inline: %lf\n",tot_time);

    begin_time = clock();
    for(int i=1;i<=10000;i++)
        for(int j=1;j<=100000;j++)
            mmax2(i,j);
    finish_time = clock();
    tot_time = (finish_time-begin_time)/CLOCKS_PER_SEC;
    printf("cost time without inline: %lf",tot_time);

    return 0;
}

通过上面的测试,我没得到啥实质性的性能提升,但正所谓C是玄学,没事还是加上吧,优化个常数也是挺好的

函数重载

一个函数或多个函数,名字相同,参数个数或参数类型不一样

意义:

  • 函数命名简单
  • 编写程序时更加的简单

编译器会尝试所有的同名函数,直到参数表完全相同时

当然你可以泛型编程,从而不用函数重载

Example:

int Max(double f1,double f2){}
int Max(int n1,int n2){}
int Max(int n1,int n2, int n3){}

注意!如果两个函数,返回值不同,名字相同,参数表相同,会报重复定义错误

函数的缺省参数

C++中定义函数时,可以让最右边的连续若干个参数有缺省值,那么调用函数时侯,相应位置不写参数,参数就是缺省值

void func(int x1,int x2=2,int x3=3){}    //正确
void func1(int x1,int x2=2,int x3){}    //错误,右边不连续

func(10); //等价于func(10,2,3)
func(10,8); //等价于func(10,8,3)
func(10,,8); //error,只有最右边连续的缺省才可以

目的:

  • 用于提高程序的可扩充性

    如果某个已经写好的函数要添加新的参数,而原先调用的语句未必需要这个参数,那么为了避免对原来函数语句的修改,就可以使用缺省参数

Last modification:February 28th, 2020 at 09:37 am
Compared with money, your comment could inspire me more.
相较于钱财,你的留言更能激发我创作的灵感