2016-11-01 6 views
0

Я хочу написать приложение на C++ с наилучшей производительностью исполнения. Поэтому я решил включить все методы.Inline все методы в C++, No Cpp file?

У меня есть проблема here.

Это дает мне неопределенную ошибку ссылки, если я использую встроенное ключевое слово внутри файла cpp в компиляторах MSVC 2015 и MinGW.

Но если я хочу встроить все методы внутри файла заголовка, не будет никаких файлов cpp. Это правда? Почему это?

+1

Inline сегодня не о производительности – deviantfan

+4

Напишите код, чтобы он работал. Если он медленный, используйте профилировщик, чтобы определить, что медленно, и исправить эту часть. Повторите по мере необходимости. Не просто решите, что вам нужно встроить все. – crashmstr

+0

@deviantfan, так что вы думаете о производительности? –

ответ

1

Нет, это неправда. Ваша основная функция не может быть встроенной по определению. See this link for more information.

+0

Итак? Большой проект с одним файлом cpp? –

3

Ключевое слово inline не имеет ничего общего с производительностью в этот день и возраст и не имеет никакого отношения к встраиванию функции!

Фактически это связано с Правилом Единого определения (или ODR)!

В ODR указывается, что программа на C++ должна иметь только одно определение каждой функции.

Это означает, что следующее приведет к ошибке:

file.cpp

void fun() {} 

main.cpp

void fun() {} 

Это ошибка, потому что есть два определения одной и той же функции в двух разных трансляционных единицах (.cpp файлах), что является нарушением ODR.

Теперь ключевое слово inline позволяет обойти это. Это позволяет вам определять одну и ту же функцию в нескольких поступательных единицах, если тело функции точно такое же! Это позволяет вам определить функцию в файле заголовка, которая затем может быть включена в несколько файлов .cpp.

Это считая. То, что вы описали, будет не вызывает замедление производительности. Компилятор выполнит правильные функции в соответствующее время. Это заставит ваш код работать быстрее, чем вы могли бы сделать это самостоятельно.

+0

Это неправильно. В моем компиляторе IAR, в режиме отладки (без оптимизации), вложение функции может иметь большое значение. На встроенной системе, над которой я работаю, мы не используем режим Release. Код отладки освобождается без символов (чтобы облегчить отладку возвращенных продуктов). Я показал в списках языка ассемблера, что inline действительно имеет значение. –

+2

@ThomasMatthews Вы выпускаете готовый продукт в режиме отладки? Я не могу обмотать голову. В любом случае, что я пытался сделать, так это то, что вы не должны выполнять работу компилятора, указав, какая функция встроена. Он может сделать это за вас. – DeiDei

+1

@ThomasMatthews, что эквивалентно помещению 'register' перед переменными для сохранения доступа к памяти. В не оптимизированной сборке это может изменить ситуацию. Но любой, кто ищет производительность, будет иметь компилятор, оптимизирующий код, что избавит от необходимости «inline» и «register». И, кстати, чрезмерная инкрустация может нанести ущерб производительности. Компилятор, вероятно, избежит этой ловушки. – eran