内联函数的用法,,,auto注意事项

inline 修饰 的函数叫做内联函数, 编译时 C++ 编译器会在 调用内联函数的地方展开 ,没有函数压
栈的开销, 内联函数提升程序运行的效率。
inline 是一种 以空间换时间 的做法,省去调用函数额开销。所以 代码很长 或者有 循环 / 递归 的函数不适宜 使用作为内联函数。
inline 对于编译器而言只是一个建议 ,编译器会自动优化,如果定义为 inline 的函数体内有循环 / 递归等 等,编译器优化时会忽略掉内联。
1. release 模式下,查看编译器生成的汇编代码中是否存在 call Add(这个就是函数调用时的压栈过程)
2. debug 模式下,需要对编译器进行设置,否则不会展开 ( 因为 debug 模式下,编译器默认不会对代码进 行优化,以下给出vs2013 的设置方式)
inline 不建议声明和定义分离,分离会导致链接错误。因为 inline 被展开,就没有函数地址了,链接就会 找不到。
不能将内联函数的声明像普通函数一样写在头文件里

拓展:

内联函数和宏很类似,而区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的(可调试)。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。可以像调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。

 
所以针对宏的缺点c++给出了改进

宏的优缺点?
优点:
1. 增强代码的复用性。
2. 提高性能。
缺点:
1. 不方便调试宏。(因为预编译阶段进行了替换)
2. 导致代码可读性差,可维护性差,容易误用。
3. 没有类型安全的检查 。
C++ 有哪些技术替代宏
1. 常量定义 换用 const
int main()
{
    //const修饰的常量具有宏替换的特性
    const int a = 10;
    int* p = (int*)&a; //&a本来时int const*类型的,经过强转后才能改变
    *p = 100;
    cout << a << endl;   //宏替换特性,打印10
    cout << *p << endl;   //打印100
    return 0;
}
2. 函数定义 换用内联函数
auto的注意事项
auto声明的变量必须由编译器在编译时期推导而得
使用auto定义变量时必须对其进行初始化,这样编译器才能推演出来.在编译阶段编译器需要根据初始化表达式来推导auto的实际类 型。因此auto并非是一种类型的声明,而是一个类型声明时的占位符,编译器在编译期会将auto替换为 变量实际的类型。
auto 声明指针类型时,用 auto auto* 没有任何区别,但用 auto 声明引用类型时则必须加 &

没有使用auto&的相当于给一个变量赋值.并不是引用 

当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对 第一个类型进行推导,然后用推导出来的类型定义其他变量
auto 不能作为函数的参数
auto 不能直接用来声明数组
auto可以方便对整个数组操作:注意是数组所有的值
     int arr[] = { 1,2,3,4 };
    for (auto& e : arr)  //给数组每个值都×2要加上&
    {
        e *= 2;
    }
    for (auto &e : arr)//打印数组的值,&可有可没有
    {
        cout << e << endl;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值