Является ли inline просто рекомендацией для компилятора?
Да. Но компоновщик нуждается в этом, если есть несколько определений функции (см. Ниже)
Должно ли это быть явно указано, когда у вас есть небольшая функция (я думаю, 1-4 инструкции?)
Для функций, определенных в заголовочных файлах, это (обычно) необходимо. Не мешало бы добавить его в небольшие функции (но я не беспокоюсь). Обратите внимание, что члены класса, определенные в объявлении класса, автоматически объявляются встроенными.
Какие еще преимущества есть при написании строки?
При правильном использовании остановит ошибки компоновщика.
нужно ли указывать inline, чтобы уменьшить размер исполняемого файла, даже если компилятор (согласно википедии [я знаю, плохая ссылка]) должен сам находить такие функции?
Нет. Компилятор сравнивает затраты и выгоды от встраивания каждого вызова функции и делает соответствующий выбор. Таким образом, вызовы функции могут быть встроены в ситуации занавеса и не встроены в других (в зависимости от того, как работает алгоритм компилятора).
Скорость / Пространство - это две конкурирующие силы, и это зависит от того, что оптимизатор оптимизирует, для чего будут определены встроенные функции погоды и погода, которую исполняемый файл будет увеличивать или уменьшать.
Также обратите внимание, что при использовании чрезмерно агрессивного встраивания, вызывающего слишком широкое расширение программы, локальность ссылок теряется, и это может фактически замедлить работу программы (так как в память необходимо поместить больше исполняемых страниц).
Множественное определение:
Файл: head.h
// Without inline the linker will choke.
/*inline*/ int add(int x, int y) { return x + y; }
extern void test()
Файл: main.cpp
#include "head.h"
#include <iostream>
int main()
{
std::cout << add(2,3) << std::endl;
test();
}
Файл: test.cpp
#include "head.h"
#include <iostream>
void test()
{
std::cout << add(2,3) << std::endl;
}
Здесь у нас есть два определения add (). Один в main.o и один в test.o