не inline'ит :(
От: avovana Россия  
Дата: 21.05.23 17:32
Оценка: :)))
Дорогие форумчане, не инлайнит

Знаю мнение, что компилятор сам определяет что инлайнить, что нет. Близко с 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(...). И она не инлайнится.

Помогите, разобраться, пожалуйста.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.