Дорогие форумчане, не инлайнит
Знаю мнение, что компилятор сам определяет что инлайнить, что нет. Близко с inline'ами не работал. Вот сейчас решил попробовать.
Казалось бы, сверх малые функции должны быть заинлайнены без проблем. Мой небольшой опыт в понимание ассемблера говорит мне о том, что нет инлайна в итоге. Есть call этих функций.
https://godbolt.org/z/vbdd1aKz4
#include <iostream>
using namespace std;
int get_limit() { return 5; }
void do_some_logic() { }
struct attempts_checker {
int limit_;
int attempts_ = 0;
inline attempts_checker(int limit) : limit_(limit)
{}
inline void operator++() {
++attempts_;
}
inline bool exceeded() {
return attempts_ < limit_;
}
};
inline bool are_exceeded(int attempts, int limit) {
return attempts >= limit;
}
int main()
{
// 1. variables
int attempt = 0;
int limit = get_limit();
attempt++;
if(attempt < limit)
do_some_logic();
// 2. struct
attempts_checker checker(get_limit());
++checker;
if(checker.exceeded())
do_some_logic();
// 3. function
int attempt_ = 0;
int limit_ = get_limit();
attempt_++;
are_exceeded(limit_, attempt_);
return 0;
}
Суть такая, что в участке где используется
attempt и
attempt_limit происходят эти проверки
if(attempt < limit) после инкремента attempt.
Поэтому я хотел сделать код чуть красивее/легче инкапсулировав эти переменные в объект. И дергать функцию
exceeded() у объекта.
В классе даже
operator++ написал не каноничный, чтобы не возвращать *this. Как надеялся, код всё-таки заинлайнился. Но нет. Везде эти ассемблерные call.
Сделал для сравнения ещё функцию
are_exceeded(...). И она не инлайнится.
Помогите, разобраться, пожалуйста.