当前位置: 首页 > news >正文

c++——内联函数和auto关键字

1.内联函数是C++中一种特殊的函数,以下是其相关介绍:

 

定义

 

内联函数是一种在编译时将函数体直接插入到调用处的函数。通过在函数定义前加上  inline  关键字来声明内联函数,例如:

 

cpp

inline int add(int a, int b)

{

    return a + b;

}

 

 

优点

 

- 提高执行效率:由于函数调用会有一定的开销,如保存现场、传递参数、跳转等,内联函数将函数体直接嵌入调用处,避免了这些开销,从而提高了程序的执行效率。

 

- 代码可读性好:在调用内联函数的地方,代码看起来就像直接写了函数体的代码一样,使代码更易理解,尤其是对于一些简短的函数。

 

缺点

 

- 增加代码体积:因为内联函数会在每个调用处展开,如果内联函数被频繁调用,可能会导致可执行文件的体积增大。

 

适用场景

 

- 适合函数体简短、频繁调用的函数,如一些简单的访问器函数或小型的计算函数。

 

注意事项

 

- 内联函数只是对编译器的一个建议,编译器不一定会将其真正内联,例如,如果函数体过于复杂,编译器可能会忽略  inline  关键字。

 

- 递归函数一般不能成为内联函数,因为递归函数的调用次数在编译时不确定,无法在调用处直接展开。

2.auto 关键字在C++ 中用于自动类型推导,以下是其主要特点和用法:
 
类型推导
 
使用 auto 声明变量时,编译器会根据初始化表达式的类型自动推导出变量的类型。例如:
 
auto num = 10; // num被推导为int类型
auto str = "Hello"; // str被推导为const char*类型
 
 
简化代码
 
在处理复杂类型时, auto 可以使代码更简洁易读。例如:
 
std::vector<int>::iterator it;(it——迭代器部分会说)
// 使用auto后
auto it = std::vector<int>::begin();
 
 
范围for循环
 
 auto 在范围 for 循环中非常有用,可以方便地遍历容器中的元素,无需显式指定元素类型。例如:
 
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto element : vec)

{
    std::cout << element << " ";
}
 


    std::vector<int> vec = {1, 2, 3, 4, 5};
    for (size_t i = 0; i < vec.size(); ++i)

    {
        std::cout << vec[i] << " ";
    }
    
这两部分代码意思一样。
 

 
注意事项
 
-  auto 声明的变量必须有初始值,因为编译器需要根据初始值来推导类型。
- 当用于函数返回值类型推导时,需要结合 decltype 等关键字使用,以明确返回值类型。
-  auto 不能用于非静态成员函数的参数类型推导。

3.补充

decltype  是 C++ 中的一个类型说明符,用于在编译时推导表达式的类型。以下是它的一些常见用法和特点:
 
1. 推导变量类型:可以根据变量名推导出其类型,例如:
 
int num = 10;
decltype(num) anotherNum = 20; // anotherNum 的类型为 int
 
 
1. 推导函数返回值类型:对于函数调用表达式, decltype  能推导出函数的返回值类型,比如:
 
int func()

{
    return 0;
}
decltype(func()) result; // result 的类型为 int
 
 
1. 推导复杂表达式类型:对于更复杂的表达式,如  decltype(a + b) ,如果  a  和  b  都是  int  类型,那么  decltype(a + b)  的类型就是  int 。再如:
 
std::vector<int> vec;
decltype(vec.begin()) it; // it 的类型为 std::vector<int>::iterator
 
 
1. 与  auto  的区别: auto  是根据初始化表达式来推导变量的类型,并且要求变量必须初始化;而  decltype  是根据表达式本身推导类型,不要求有初始化操作,它可以用于推导未初始化的变量类型或函数的返回值类型等。
 
 decltype  在模板编程、泛型编程中非常有用,它可以让程序员在不知道具体类型的情况下,根据已有的表达式来准确地获取类型信息,从而提高代码的通用性和灵活性。

相关文章:

  • Vue3 watch 与 watchEffect 深度解析
  • 剑指Offer(数据结构与算法面试题精讲)C++版——day10
  • Ceph异地数据同步之- S3对象异地同步复制
  • Android-应用签名
  • 使用 VcXsrv 在 Windows 10 上运行 Ubuntu 图形界面
  • Java中的注解技术讲解
  • 怎么检查网站CDN缓存是否生效
  • 应用安全系列之四十六:Expression Language Injection (EL注入)
  • C语言实现TcpDump
  • MATLAB在工程领域的实际应用案例
  • 【 antd 】Form表单组件,“change“ 不生效
  • RK3588芯片NPU的使用:Windows11 Docker中运行PPOCRv4例子
  • 人工智能100问☞第1问:人工智能(AI)的定义是什么?
  • [D1,2]回溯刷题
  • python面试技巧
  • Android 应用蓝牙连接通信实现
  • 巧*书重大更新!商务标智能编写,标书一次成型!
  • 函数式编程在 Java:Function、BiFunction、UnaryOperator 你真的会用?
  • 研发效能实践:BDD(行为驱动开发)深度解毒手册:从「撕逼大会」到「人见人爱」的协作秘笈
  • chrome提示https不安全, 不能记住账号密码怎么办? 可以利用js输入账号
  • 专做零食的网站/长尾词优化外包
  • 交易平台网站建设/电商培训课程
  • 武夷山市建设局网站/营销策略包括哪些方面
  • .net网站做优化/什么推广软件效果好
  • 中核工建设集团网站/网站快速优化排名app
  • 建三江廉政建设网站/在线种子资源库