Доброе утро/день/вечер, Codeforces.
Сегодня я, сдавая задачу 89D - Космические мины на С++, задумался о том, что у в моем коде много коротких функций, которые вызываются по много раз, и о том, что это может повлиять на производительность. Я всегда пишу относительно короткие функции с inline. inline-функция (или встроенная функция) на этапе компиляции заменяется в коде не на вызов функции, а прямо на тело, т.е. как макрос, только на уровень ниже.
Но если написать inline int f(){ //some code}, это не гарантирует, что компилятор сделает функцию f() встроенной, это только как бы намекает компилятору, что стоило бы сделать эту функцию таковой, а он уже сам решает стоит это делать или нет.
Поэтому я решил проконтролировать компилятор и посмотреть, действительно ли все функции типа inline double dist(const point& a, const point& b) { return sqrtl(sqr(a.X - b.X) + sqr(a.Y - b.Y)); } стали встроенными. В результате небольшого гугления я получил следующие решения:
- На g++ есть опция -Winline, которая генерирует warning, если функция, перед которой написано ключевое слово inline, не была сделана встроенной
- На Visual C++ есть аналогичный warning 4-го уровня. Также можно писать перед функциями __forceinline. Если компилятор не сделает встроенной функцию с __forceinline, то он сгенерирует warning 1-го уровня.