函数的升级(上)

内联函数

C++中推荐使用内联函数替代宏代码片段

C++中使用inline关键字声明内联函数

inline int func(int a ,int b)

{

return a < b ? a : b;

}

内联函数声明时inline关键字必须和函数定义结合在一起,不是和函数声明结合在一起,否则编译器会直接忽略内联请求

C++编译器可以将一个函数进行内联编译

被C++编译器内联编译的函数叫做内联函数

内联函数在最终生成的代码中时没有定义的

C++编译器直接将函数体插入函数调用的地方

int main()
{
    int c = func(1,2);   ==>  int c = 1 < 2 ? 1 : 2;
    ......
}

内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)

C++编译器不一定准许函数的内联请求!编译器不准许则按普通函数处理


内联函数是一种特殊的函数,具有普通函数的特性(参数检查,返回类型等)

内联函数是对编译器的一种请求,因此编译器可能拒绝这种请求

内联函数由编译器处理,直接将编译后的函数体插入调用的地方

.宏代码片段由预处理器处理,进行简单的文本替换,没有任何编译过程

内联函数没有宏的副作用,较宏更安全

例:

#define FUNC(a,b) ((a) < (b) ? (a) : (b))
inline int func(int a,int b)
{
    return a < b ? a : b;
}
int main()
{
    int a = 1;
    int b = 3;
    int c =
func(++a,b);//采用内联函数输出2,3,2 
    //int c =FUNC(++a,b);//采用输出3,3,3
    printf("a = %d\n",a);
    printf("b = %d\n",b);
    printf("c = %d\n",c);

     ......   
}

现代C++编译器能够进行编译优化,因此一些函数即使没有inline声明,也可能被编译器内联编译

另外一些现代C++编译器提供了扩展语法,能够对函数进行强制内联

如:g++中的__attribute__((always_inline))属性

C++中内联编译的限制:

.不能存在任何形式的循环语句

.不能存在过多的条件判断语句

.函数体不能过于庞大

.不能对函数进行取址操作

.函数内联声明必须在调用语句之前

编译器罪域内联函数的限制并不是绝对的,内联函数相对于普通函数的优势只是省去了函数调用时压栈,跳转和返回的开销。因此,当函数体的执行开销远大于压栈,跳转和返回所用的开销时,那么内联将无意义。


C++中内联函数的实现机制


C++编译到func函数是发现有内联声明,就是说程序请求将func函数做成内联函数,C++编译器这时就智能的去看下他的函数体,发现这个函数还是比较简单,符合做成内联函数的要求,于是C++编译器就将这个函数放到他的符号表里面,然后继续编译,编译到int r=func(1,2);这条语句时,发现func在符号表里面能找到,于是编译器就先对这个func调用里面的两个参数进行类型检查看看书否匹配,发现匹配然后编译器就直接到符号表里将func函数的函数体拿出来直接放到func(1,2)这个地方,所以说一个函数如果成功的进行内联编译后,在他最后生成的汇编代码里根本找不到函数调用跟函数定义的代码。


函数默认参数

C++中可以在函数声明时为参数提供一个默认值,当函数调用时没有指定这个参数的值,编译器会自动用默认值代替

例:

int mul(int x = 3);   //声明时指定默认参数值

int main(int argc, char *argv[])
{
    printf("mul(2) = %d\n",mul(2));    //输出4
    printf("mul(-2) = %d\n",mul(-2)); //输出4
    printf("mul() = %d\n",mul());        //输出9
    ......
}

int mul(int x)   //定义时不再指定
{
    return x * x;
}


函数默认参数的规则:

.只有参数列表后面部分的参数才可以提供默认参数值

       .一旦在一个函数调用中开始使用默认参数值,那么这个参数后的所有参数都必须使用默认参数值

例:

int add(int a, int b = 0, int c = 0)
{
    return a + b + c;
}

int main(int argc, char *argv[])
{
    printf("add(2) = %d\n",add(2));  //从第二个参数开始使用默认参数值,那么第三个参数也必须使用默认参数值,输出2
    printf("add(1,2) = %d\n",add(1,2));//从第二个参数开始使用默认参数值,输出3
    printf("add(1,2,3) = %d\n",add(1,2,3));//未使用默认参数值,输出6
    ......
}


函数占位参数

在C++中可以为函数提供占位参数

.占位参数只有参数类型声明,而没有参数名声明

.一般情况下,在函数体内部无法使用占位参数

例:

int func(int a, int b, int)  //第三个参数没有名字是占位参数,因为没有名字所以在函数体内无法使用,占位参数本质上也是一个参数,调用这个函数的时候必须提供3个实参
{
    return a + b;
}

int main(int argc, char *argv[])
{
    printf("func(1,2,3) = %d\n",func(1,2,3));  //输出3,func必须提供3个参数,否则(如func(1,2))会报错
    ......
}


C++支持这样的函数占位参数有什么意义?

可以将占位参数与默认参数结合起来使用

意义:

1.为以后程序的扩展留下线索;

int func(int a, int b, int = 0)    

工程中看到这样的写法,就知道原来的作者这么写是为了告诉后来的维护者这个函数是有可能改动的,他的功能可能没有完成,但是暂时在项目里又够用,也许未来哪一天这个函数就需要被改写或者被重写

2.兼容C语言程序中可能出现的不规范写法

例:

test.c程序

int func()
{
    return 1;
}
int main(int argc, char *argv[])
{
    printf("func() = %d\n",func());
    printf("func(1) = %d\n",func(1));
    ......
}  //在C编译器中正确编译通过

test.cpp程序

int func()
{
    return 1;
}
int main(int argc, char *argv[])
{
    printf("func() = %d\n",func());
    printf("func(1) = %d\n",func(1));  //C++编译器此处报错
    ......
}

C++为了兼容C语言中的这种不规范,可修改函数定义的参数列表中加入函数占位参数,并且给此函数占位参数一个默认值

test.cpp程序

int func(int = 0)  //也可提醒程序员此处有占位参数,又提供了一个默认值,证明这个函数是有问题的,日后有时间修改这个C程序移植到C++程序中不规范的问题
{
    return 1;
}
int main(int argc, char *argv[])
{
    printf("func() = %d\n",func());
    printf("func(1) = %d\n",func(1)); 
    ......
}  //C++编译正确通过


小结

C++中可以通过inline声明内联函数

内联函数在编译时直接将函数体插入函数调用的地方

inline只是一种请求,编译器不一定允许这种请求

内联函数省去了普通函数调用时压栈,跳转,返回的开销

C++中在声明函数时指定参数的默认值

C++可以声明占位符参数,占位符参数一般用于程序扩展和对C代码的兼容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Excel 函数升级包是指微软公司为了提高 Excel 电子表格软件的功能和性能而发布的补丁或更新程序。这些功能升级包通常包含了新的函数、修复了已有函数的 bug,并提供了更好的性能和用户体验。 Excel 是一款功能强大的电子表格软件,它提供了众多的内置函数用于处理和分析数据。然而,随着用户需求的不断增加和技术的不断发展,对于更强大的数据处理和分析功能的需求也越来越高。因此,微软公司会定期发布 Excel 函数升级包来满足用户的需求。 这些函数升级包通常会新增一些功能强大的函数,如在处理文本、日期和时间、逻辑判断等方面。升级包还可能修复已知的函数 bug,提高函数的稳定性和可靠性。此外,函数升级包还可能提供更优化的性能,使得计算速度更快,并提供更好的用户界面,使用户更方便地使用和管理函数。 对于使用 Excel 的用户来说,Excel 函数升级包意味着更强大的数据处理和分析能力,可以更高效地完成工作。用户不需要手动进行函数升级,只需要及时安装并更新 Excel 软件即可享受到这些新的功能和改进。同时,这也体现了微软公司对于用户体验和功能改进的关注,不断提升 Excel 软件的竞争力。 总之,Excel 函数升级包是微软公司为了提高 Excel 电子表格软件的功能和性能而发布的补丁或更新程序,它可以为用户提供更强大的数据处理和分析能力,并提供更好的用户体验。用户可以通过及时安装和更新 Excel 软件来享受这些新的功能和改进。 ### 回答2: Excel函数升级包是指微软公司针对Excel软件的函数进行的功能升级和修复补丁的集合。这些升级包的目的是提高Excel软件的功能性和稳定性。通过安装Excel函数升级包,用户可以获得新添加的函数、改进或修复已有函数的问题,从而更好地应对各种数据处理和分析需求。 Excel函数升级包通常由微软公司定期发布,以解决Excel软件本身存在的问题和漏洞。这些升级包在发布前经过严格的测试,确保其能够正常运行并不会对Excel软件的功能产生负面影响。 通过安装Excel函数升级包,用户可以获得更多新的函数,这些函数可以帮助用户更高效地处理数据。升级包还可以修复已有函数在某些情况下出现错误或不正常运行的问题,提高函数的运行稳定性和准确性。 除了新函数的添加和旧函数的修复,Excel函数升级包还可以提供其他额外的功能和工具,例如改进的图表功能、数据筛选和排序的增强、更灵活的数据透视表等。这些更新可以使用户在Excel软件中更方便地进行数据分析和报告生成。 总之,Excel函数升级包是为了让用户更好地利用Excel软件进行数据处理和分析而发布的更新。用户可以定期安装这些升级包,以确保Excel软件始终保持最新的功能和修复补丁,提高工作效率和数据处理准确性。 ### 回答3: Excel 函数升级包是指用于提升 Excel 软件功能的升级程序。它可以为用户提供更多的函数选项,提高数据处理效率和灵活性。 Excel 是一款强大的电子表格软件,拥有丰富的内置函数,如求和、平均值、最大值、最小值等。但是随着用户需求的增加,内置的函数可能无法满足所有的需求。因此,Excel 函数升级包的出现可以为用户提供更多的函数选项,帮助用户更灵活地处理数据。 升级包可以提供各种常用的统计函数、数学函数、逻辑函数、日期函数等,用户只需要将升级包安装到 Excel 软件中,就可以使用这些新增的函数升级包还可以包含一些特殊功能的函数,如数据分析工具包,可以进行回归分析、透视表分析等。 通过升级包,用户可以更方便地进行数据清洗、数据分析和数据可视化,提高工作效率。升级包还可以为用户提供更多的图表类型、数据排序和筛选、条件格式等功能,使用户可以更直观地展示和分析数据。 Excel 函数升级包可以兼容不同版本的 Excel 软件,用户可以根据自己的需求选择合适的升级包进行安装。同时,由于升级包是可选的,用户可以根据实际需求来决定是否安装。 总之,Excel 函数升级包是为了满足用户不断增长的需求而推出的一种增强 Excel 功能的工具,通过安装升级包可以获得更多的函数选项,提高数据处理效率和灵活性,帮助用户更好地进行数据分析和可视化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值