什么时候不应该声明函数内联(GCC编译器)?

时间:2019-03-02 13:31:57

标签: c++ gcc

我需要编写一个程序来找出内联函数使用的限制。

我发现了有关GCC编译器(http://gcc.gnu.org/onlinedocs/gcc/Inline.html#Inline)的以下信息:

请注意,函数定义中的某些用法可能使其不适合内联替换。这些用法包​​括:可变函数,使用alloca,使用已计算的goto(请参见标签作为值),使用非本地goto,使用嵌套函数,使用setjmp,使用__builtin_longjmp以及使用__builtin_return或__builtin_apply_args。当无法替换标记为inline的函数时,使用-Winline会发出警告,并给出失败的原因。

然后我编写了具有可变参数功能的以下程序:

#include <cstdarg>
#include <iostream>

using namespace std;

inline double average(int count, ...) {
    va_list ap;
    int j;
    double sum = 0;

    va_start(ap, count);

    for (j = 0; j < count; j++) {
        /* Increments ap to the next argument. */
        sum += va_arg(ap, int);
    }
    va_end(ap);

    return sum / count;
}  

int main(void) {
    cout << average(4,6,8,2,3);
    return 0;
}

,然后像这样编译我的程序:g++ -Wall -Winline program.cpp。 编译后,-Winline没有发出警告。

我做错了什么?感谢您的回答!

1 个答案:

答案 0 :(得分:3)

在您链接的页面上:

  

GCC在不优化时不会内联任何功能

在命令行中添加-O2会在Godbolt中产生以下警告:

<source>: In function 'double average(int, ...)':
<source>:6:15: warning: function 'double average(int, ...)' can never be inlined because it uses variable argument lists [-Winline]

 inline double average(int count, ...)   
               ^~~~~~~

<source>: In function 'int main()':
<source>:6:15: warning: inlining failed in call to 'double average(int, ...)': function not inlinable [-Winline]
<source>:23:30: note: called from here
     cout << average(4,6,8,2,3);

                              ^