zoukankan      html  css  js  c++  java
  • 内联函数分析

    1. 内联函数的声明

    • 在C++中,const常量可以代替宏常数定义,而宏代码段则推荐使用内联函数来代替。
    • C++中使用inline关键字声明内联函数
    • inline只是一种请求,编译器不一定允许这种请求
    • inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求
    inline int func(int a, int b)
    {
        return a < b ? a : b;
    }
    

    2. 内联函数的特性

    • C++编译器直接将内联函数的函数体扩展到函数调用的地方
    • 内联函数调用时没有压栈、跳转、返回等额外开销
    • 内联函数具有参数检查、返回类型等普通函数特征
    • 内联函数与宏代码段相比,保留了比普通函数效率更高、开销更小的优点,摒弃了宏代码段不经过编译器可能带来副作用的缺点
    #include <stdio.h>
    
    #define MAX(a, b) ((a) < (b) ? (a) : (b))
    
    inline int max(int a, int b)
    {
        return a < b ? a : b;
    }
    
    int main(int argc, char *argv[])
    {
        int a1 = 1;
        int b1 = 3;
        int c1 = MAX(++a1, b1);
    
        int a2 = 1;
        int b2 = 3;
        int c2 = max(++a2, b2);
    
        printf("a1 = %d
    ", a1);
        printf("b1 = %d
    ", b1);
        printf("c1 = %d
    ", c1);
    
        printf("
    ");
    
        printf("a2 = %d
    ", a2);
        printf("b2 = %d
    ", b2);
        printf("c2 = %d
    ", c2);
    
        return 0;
    }
    

    3. 内联函数与编译器

    • 现代C++编译器能够进行编译优化,函数即使没有inline声明,也可能被内联编译;声明了inline,编译器也未必会同意
    • 一些现代C++编译器还提供了扩展语法,允许强制内联,如g++的__attribute__((always_inline))
    __attribute__((always_inline)) int func(int a, int b)
    {
        return a < b ? a : b;
    }
    

    4. 内联函数的限制

    C++语言对内联函数具有以下限制:

    • 不能存在任何形式的循环语句
    • 不能存在过多的条件判断语句
    • 函数体不能过于庞大
    • 不能对函数进行取址操作
    • 函数内联声明必须在调用语句之前

    注意:这些只是C++语言本身对内联函数的限制,现代C++编译器可以突破这些限制,实际上,只要函数不是过于夸张,内联一般都是可以成功的。

  • 相关阅读:
    python基础----装饰器
    python基础----函数的定义和调用、return语句、变量作用域、传参、函数嵌套、函数对象、闭包、递归函数
    python基础----文件处理
    python基础
    django时间的时区问题
    django-admin详细设置
    Django框架-模板系统
    Django框架--路由分配系统
    jQuery教程
    django博客项目11
  • 原文地址:https://www.cnblogs.com/songhe364826110/p/11518886.html
Copyright © 2011-2022 走看看