【实验】C++inline函数中过复杂的语句能否替换到函数调用处?

目的

C++inline函数中过复杂的语句能否替换到函数调用处

步骤

1. 实验短小代码的inline函数,看是否能带入

测试代码如下:

inline int foo(int a, int b){
    return a + b;
}

int main(){
    int a, b, c;
    a = 1;
    b = 2;
    c = foo(a, b);
    return 0;
}

命令:

g++ -S a.cpp -o 1_*.s

实验结果:

在这里插入图片描述


其中各个编译结果说明:

  • 左边是没加inline的函数调用的编译结果
  • 中间是加inline的函数调用的编译结果
  • 右边是直接将inline函数体带入函数的编译结果

结论:

结果发现左中相同,是不是说明inline没有起作用?


2. 采用编译优化选项,继续测试短小代码的inline函数

最后发现,编译时是可以不进行内联的。内联可以发生在编译优化时。所以加上**-O**对编译命令进行优化:【1】

g++ -S -O a.cpp

测试结果:

在这里插入图片描述

结论

可以看到左右两边不同,说明inline函数起到了代入函数作用


3. 测试inline函数中过复杂的语句能否替换到函数调用处

被调用函数中增加语句,变为:

inline int Foo(int a, int b){
    while(a--){
        b++;
    }
    if(a>b)
        return a;
    else
        return b;
}

int main(){
    int a, b, c;
    a = 1;
    b = 2;
    c = Foo(a, b);
    return 0;
}

命令:

g++ -S a.cpp -o test_*.s

结果:

在这里插入图片描述


其中布局和第一张图相同。

问题:

对比左2与左3的汇编结果,可发现两文件main部分不同。左3与左4是相同的。所以是否可以说明inline体过复杂时,也能实现带入?

参考:

不要低估编译器决定是否将inline函数实际内联到函数调用处使用的智商。
(^_^)