Когда мы не должны объявлять встроенную функцию (компилятор GCC)? - PullRequest
0 голосов
/ 02 марта 2019

Мне нужно написать программу, которая выяснит ограничения использования встроенных функций.

Я нашел следующую информацию для компилятора GCC (http://gcc.gnu.org/onlinedocs/gcc/Inline.html#Inline):

Обратите внимание, что некоторыеИспользование в определении функции может сделать ее непригодной для встроенной замены. Среди них: переменные функции, использование alloca, использование вычисленного goto (см. Метки как значения), использование нелокального goto, использование вложенных функций, использование setjmp,использование __builtin_longjmp и использование __builtin_return или __builtin_apply_args. Использование -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 голосов
/ 02 марта 2019

На странице, на которую вы ссылаетесь:

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);

                              ^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...