欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++(内联函数的使用----第6课)

程序员文章站 2024-02-25 11:37:04
...

1.C++中的const常量可以替代宏常数定义

如:
const int A = 3; <–> #define A 3
C++中是否有解决方案替代宏代码片段呢?有,内联函数(c 中的宏定义只是预处理器的粘贴复制,而内联函数是c++编译器的操作,自然会有类型判别,这解决了c中宏定义带来的一些可能的问题。)

看代码(可以看出宏定义的问题

#include <stdio.h>

#define FUNC(a, b) ((a) < (b) ? (a) : (b))

inline int func(int a, int b)
{
    return a < b ? a : b;
}

int main(int argc, char *argv[])
{
    int a = 1;
    int b = 3;
    int c = FUNC(++a, b);
    
    printf("a = %d\n", a);
    printf("b = %d\n", b);
    printf("c = %d\n", c);
    
    return 0;
}

3 3 3

换成内联函数的话,自然就是 2 3 2

为什么会出现3 3 3 的定义,我们不妨替代一下看看

((a++)<(b)?(a++):(b))

    2<3?3:3

所以最终是错的啦!

但是内联函数只是一个请求,你不清楚有没有用,这时候要设置vs中属性它默认为同意,就OK啦!

小结:内联函数具有普通函数的特征(参数检查,返回类型等)函数的内联请求可能被编译器拒绝
函数被内联编译后,函数体直接扩展到调用的地方宏代码片段由预处理器处理,进行简单的文本替换,没有任何编译过程,因此可能出现副作用。现代C++编译器能够进行编译优化,一些函数即使没有inline声明,也可能被内联编译一些现代C++编译器提供了扩展语法,能够对函数进行强制内联,如:g++:attribute((always_inline))属性 MSVC:_forceinline。

          C++(内联函数的使用----第6课)

 6-2 内联函数深度示例

 

#include <stdio.h>
//__forceinline
//__attribute__((always_inline))
inline 
int add_inline(int n);
int main(int argc, char *argv[])
{
    int r = add_inline(10);
    printf(" r = %d\n", r);
    return 0;
}
inline int add_inline(int n)
{
    int ret = 0;
    for(int i=0; i<n; i++)
    {
        ret += i;
    }
    return ret;
}

3.注意事项(其实现在问题不大,不存在这么多的限制的)
C++中inline内联编译的限制
不能存在任何形式的循环语句
不能存在过多的条件判断语句
函数体不能过于庞大
不能对函数进行取值操作
函数内联声明必须在调用语句之前
小结:
C++中可以通过inline声明内联函数
编译器直接将内联函数体扩展到函数调用的地方
inline只是一种请求,编译器不一定允许这种请求
内联函数省去了函数调用时压栈,跳转和返回的开销
 

相关标签: c++