2015-03-02 2 views
1

Я компиляции следующий простой пример:функции не встраиваются с г ++

#include <iostream> 

struct PP 
{ 
    inline void wInline(); 
} 

inline void PP::wInline() 
{ 
    std::cout << "hola" << endl; 
} 

int main() 
{ 
    PP pp; 
    pp.wInline(); 
    return 0; 
} 

таким образом:

g++ -O0 -finline-functions -finline-functions-called-once 
-finline-small-functions -Wall -Wextra -pedantic -std=c++11 -Winline 
main.cpp 

с GCC 4.8.2 и wInline не быть встраиваемыми.

Существуют ли функции -finline-функции -finline-functions-called-once и -finline-small-functions флаги? Почему у меня нет предупреждений даже при включенном флаге -Winline?

+0

Для чего стоит PP?/просто любопытно –

+0

Пожалуйста, используйте свой редактор и возможности для копирования и вставки браузера вместо повторной печати. Было бы неплохо иметь код, который на самом деле компилируется. Вы явно сделали попытку создать короткий автономный тестовый тест, спасибо за это, просто сделайте его действительным. :) – hvd

+0

Почему, по вашему мнению, функция не встроена? Вы можете показать сборку? –

ответ

1

Ключевое слово inline - это подсказка к оптимизатору. Поскольку вы компилируете с помощью -O0, оптимизация не выполняется.

gcc documentation The говорит, что это о -Winline:

Предупредить, если функция, которая объявлена ​​как инлайн не может быть встраиваемыми.

Есть правила, какие функции могут быть объявлены inline, а также эвристики, которые использует GCC, чтобы решить, должен ли он встраивать функцию объявлена ​​как инлайн.

Вы можете узнать больше о ключе inlinehere.

(Отредактировано для ответа на второй вопрос.)

+0

Вы не ответили на второй вопрос OP, почему '-Winline' не предупреждает об этом. В документации ничего не говорится об оптимизации, которая должна быть включена для получения предупреждений. Вы хотите добавить что-то об этом в свой ответ? – hvd

+0

Я не думаю, что ключевое слово 'inline' не предназначено для подсказки. Это означает, что _code_ является встроенным (в источнике), а не то, что сборка должна быть встроена. –

+0

Это означает, что сгенерированный машинный код должен быть записан там, где в противном случае будет использоваться вызов функции. Прочтите ссылки, которые я добавил в ответ. –

Смежные вопросы