zoukankan      html  css  js  c++  java
  • C/C++内联函数

    使用方法

    内联 inline 是个修饰符,用来修饰体积不大又调用频繁的函数,可以减小函数调用的开销。

     

    所谓减小开销,就是在编译时把函数体的代码嵌入进去,达到和宏类似的效果,这样程序在运行到该函数时,就不需要在频繁的跳转中消耗栈的空间。

     

    从经验上来说,函数体在十行以内,执行逻辑极其简单(写值,简单的判断和计算等),调用又十分频繁,尤其是一些工程代码中会放在周期循环里一直跑的,联系到其它模块的函数,就可以写成内联函数。

     

    格式:

    inline + <函数头>

    使用起来很简单,在函数头前面加上个inline就行,但有一点要注意,inline修饰的函数要当场给出其原型。inline只是修饰符,不能用作声明

    下面写法是不允许的:

    inline int max(int a,int b);
    
    int max(int a,int b)
    {
        //......
    }

    下面写法是允许的:

    int max(int a,int b);
    
    inline int max(int a,int b)
    {
        //......
    }

     

    另外,内联函数无法使用for,while,switch语句。C++的类里面的成员函数会被默认为内敛函数。

     

    慎用内敛函数,除非它足够简单。最好把它们统一写到一个头文件里使用。

    和宏有什么区别?

     1.内联函数在运行时可调试,而宏定义不可以;

    2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;

    3.内联函数可以访问类的成员变量,宏定义则不能;

    4.在类中声明同时定义的成员函数,自动转化为内联函数。

     

    宏是不加任何验证的简单的代码字符串替换,而内联函数说到底仍然是函数。

    练习

    定义一种结构体,内部有两个vector容器,一个用来存储奇数,一个用来存储偶数。

    定义两个内联函数,第一个判断特定数字是奇数还是偶数,第二个把数字作区分后写到结构体里的vector容器内。

    检测0~99内的一百个数,分别显示出所有奇数和偶数。

    extra.h

    #ifndef _EXTRA_H_
    #define _EXTRA_H_
    
    #include <iostream>
    #include <vector>
    using std::vector;
    
    typedef unsigned short        uint8;
    typedef bool                  B;
    
    typedef struct
    {
        vector<uint8>oddnumbers;
        vector<uint8>evennumbers;
    }NUMBERS_ST;
    
    NUMBERS_ST hundred_numbers;
    
    inline B check_odd_even(uint8 n)
    {
        return (n%2>0)?true:false;
    }
    
    inline void write_odd_even_numbers(uint8 n)
    {
        if(check_odd_even(n))
        {
            hundred_numbers.oddnumbers.push_back(n);
        }
        else
        {
            hundred_numbers.evennumbers.push_back(n);
        }
    }
    
    
    #endif // _EXTRA_H_

    main.cpp

    #include "extra.h"
    
    int main()
    {
        for(uint8 i=0;i<100;i++)
        {
            write_odd_even_numbers(i);
        }
        std::cout<<"Odd numbers:
    ";
        for(uint8 i=0;i<hundred_numbers.oddnumbers.size();i++)
        {
            std::cout<<hundred_numbers.oddnumbers[i]<<" ";
        }
        std::cout<<"
    ";
        std::cout<<"Even numbers:
    ";
        for(uint8 i=0;i<hundred_numbers.evennumbers.size();i++)
        {
            std::cout<<hundred_numbers.evennumbers[i]<<" ";
        }
    
    }

    结果

  • 相关阅读:
    js控制打印 转的
    原生javascript Ajax
    前端页面js与flash交互——js获取flash对象,并传递参数
    物联网技术概要
    socket.io 入门教程
    转载:socket.io 入门
    转载:node.js socket.io
    IIS7 应用程序池设置成 经典 v2.0
    .net 估计要死在你手里了
    彻底的放弃.net
  • 原文地址:https://www.cnblogs.com/banmei-brandy/p/11775779.html
Copyright © 2011-2022 走看看