• C/C++内联函数和extern "C"问题讨论


         今天讨论下C/C++的几个觉问题。

    内联(inline)函数

           提到内联函数,先看下面两个程序,程序的执行结界都是为了得到两个值相加之和:

    //程序1
    int add(int x,int y)
    {
    return x+y;
    }

    int main(int argc,char* argv[])
    {
    int a=1,b=2,c;
    c=add(a,b); //通过调用函数的形式得到相加结果
    return 0;
    }

    //程序2
    int main(int argc,int argv[])
    {
    int a=1,b=2,c;
    c=a+b; //直接计算得到相加结果
    return 0;
    }

    上面哪个程序的执行效率更高?

          答案是“程序2”是c=a+b直接计算得到相加结果,而“程序1”是通过函数调用c=add(a,b)得到相加的结果。“程序2”的直接计算,节省了函数调用、参数传值、控制权转移等开销,执行效率比“程序1”的函数调用要快得多。

          然而,实际工作中,可能会更多地采用“程序1”的函数调用方式,因为从功能封装和重复使用上来说,通常会将一段通用的程序片段进行封装,以便在其他需要相同功能的地方调用。这就产生了一个矛盾,如果将一段特定功能的代码封装成一个函数,就会大大降低程序效率。

          为了解决这个问题,C++引入了内联函数的概念。内联函数给出了一种解决方案:如果一个函数被指定为内联(inline)函数,则它将在调用点上被“内联”地展开,内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在调用处。

           这意味着,编写代码时,可以采用“程序1”的函数调用形式,等到编译时,编译器会把“程序1”方式编译成“程序2”的方式,这就是内联函数的优点所在。唯一要做的就是,在“程序1”中加入关键字inline。

    //程序3
    inline int add(int x,int y) //声明为内联(inline)函数
    {
    return x+y;
    }

    int main(int argc,char* argv[])
    {
    int a=1,b=2,c;
    c=add(a,b);
    return 0;
    }

           注意:所谓inline函数,只是对C++编译器的一个建议。C++编译器可以选择忽略这个建议,比如对于大于1200行的函数,或者递归调用的函数,或者用到递归调用的函数,通常C++编译器都不会编译成内联函数。

    extern "C"

          时常在C++的代码之中看到这样的代码:

    #ifdef _cplusplus 
    extern "C" {
    #endif

    //一段代码

    #ifdef _cplusplus
    }
    #endif

          这样的代码到底是什么意思呢?首先,_cplusplus是C++中的自定义宏,那么定义了这个宏则表示这是一段C++的代码,也就是说,上面的代码的含义是:如果这是一段C++的代码,那么加入extern "C"{和}处理其中的代码。

          要明白为何使用extern "C",还得从C++中的重载函数入手。在C++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等。而在C中,只是简单的函数名字而已,不会加入其他的信息。也就是说:C++和C对产生的函数名字的处理是不一样的。所以,一句话,加入extern "C"是防止名字改编。

          C和C++对函数的处理方式是不同的。extern "C"是使C++能够调用C写的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话,那么就要使用extern "C"来说明。

           

  • 相关阅读:
    Java面向对象---重写(Override)与重载(Overload)
    Java面向对象---继承
    Java 异常处理
    Java 正则表达式
    Java 日期时间
    Java Number & Math 类
    Java StringBuffer 和 StringBuilder 类
    使用老毛桃安装Windows操作系统
    Horizon代码的层次结构
    云平台-资源监控模块和分布式日志采集系统模块
  • 原文地址:https://www.cnblogs.com/danshui/p/2309601.html
Copyright © 2020-2023  润新知