Перейти к содержанию
    

Плавный переход C -> C++ под МК

1 hour ago, haker_fox said:

Обычно у меня такое всегда прокатывает, если тело функции расположить в хидере

Оно и должно быть в header'e, ODR требует, чтобы тело функции было видно везде, где используется "инлайнуемый" (о какой термин выдумал!)

32 minutes ago, Arlleex said:

Почему только разработчики компиляторов не хотят сделать прагму __attribute__((boss_sredi_inline)), чтобы 100% инлайнил... Гадство:to_take_umbrage:

Потому что этим занимается оптимизатор, к нему приходит уже скомпилированный код, а 100%, это означает - "инлайнить даже когда это невозможно", но оптимизатор не должен ломать работоспособность программы. А "инлайнить всегда, когда это возможно", - такиой ключ вам выше привёл @Forger:

2 hours ago, Forger said:

можно усилить эффект, добавив еще и __attribute__((always_inline)) на примере ARM компилятора (у GCC вроде также).

 

 

Изменено пользователем one_eight_seven

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, one_eight_seven сказал:

А "инлайнить всегда, когда это возможно"...

Тем не менее, это не гарантирует встраивание (см. функцию AtonicOr() у @jcxz).

Сегодня компилятор + оптимизатор сделали все чистенько. Проект растет, и на каком-то релизе *хлоп* и сплошные BL на максимальной оптимизации...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, Arlleex said:

Тем не менее, это не гарантирует встраивание (см. функцию AtonicOr() у @jcxz).

Одна функция, в отрыве от всего проекта, включая опции компиляции, ничего не показывает. (В общем-то, это то же самое, что вы сказали во втором сообщении).

P.S.
Можете посмотреть здесь. Поиск по слову "inline", и чтение результатов - даёт некотрое понимание.

Например, что мало слова "inline", нужно ещё и сам механизм инлайна включить.

Не вставил ссылку: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

Изменено пользователем one_eight_seven

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В Keil тоже отдельно включается:smile:

Ну все равно вот представьте, как бы хорошо жилось, если бы было "жесточайшее" требование тулчейну - инлайнить! Типа под ответственность программиста. А программист, не будь дураком, такие "спичечные" конструкции а-ля переменную записать/считать, как раз этим "жестким" инлайном и задекларирует... В любом случае, ИМХО, чего бы там не наплел оптимизатор, самым оптимальным для таких конструкций будет жесткое встраивание.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Forger сказал:

Нет, по опыту это совсем не так. Нет никакого значения для компилятора где объявлена и где реализована функция 

Опыт это одно, а стандарт говорит, что это одно и тоже

class A
{
  void func() {
    // some code
  }
};

 

class A
{
  inline void func();
};

inline void A::func() {
  // some code
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, antis said:

Опыт это одно, а стандарт говорит, что это одно и тоже

Такие заявления неплохо бы подверждать ссылками.

https://en.cppreference.com/w/cpp/language/inline

Изменено пользователем one_eight_seven

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, one_eight_seven сказал:

Такие заявления неплохо бы подверждать ссылками.

Ну, тот который первый в гугле открылся (с. 135)

Цитата

3 A function defined within a class definition is an inline function. The inline specifier shall not appear on a block scope function declaration. If the inline specifier is used in a friend declaration, that declaration shall be a definition or the function shall have previously been declared inline.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 minutes ago, antis said:

Опыт это одно, а стандарт говорит, что это одно и тоже

В таком случае реализация функции внутри класса = inline, который как известно далеко не гарантирует inline по факту, короче, на то воля божья компилятора :mda:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, Arlleex said:

Видимо, вы отвечали, пока я ссылку вставлял. У меня сегодня с этим какие-то проблемы.

1 minute ago, Forger said:

В таком случае реализация функции внутри класса = inline, который как известно далеко не гарантирует inline по факту, короче, на то воля божья компилятора 

Да. Именно так. На самом деле, такая функция не может быть неинлайновой, потому что иначе будет ругань на множественное определение и ошибка компиляции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Arlleex сказал:

Почему только разработчики компиляторов не хотят сделать прагму __attribute__((boss_sredi_inline)), чтобы 100% инлайнил... Гадство:to_take_umbrage:

И подобную обратную. Голосуем за петицию! :good3:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, jcxz said:

И подобную обратную

а с -fno-inline что не так?

А, понял, так же 100% хочется. Ну да, было бы полезно.

Изменено пользователем one_eight_seven

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, one_eight_seven сказал:

а с -fno-inline что не так?

Это GCC? У меня IAR. И я про модификатор конкретных функций, а не ключ компилятору на всё подряд.

Да, в IAR есть: #pragma inline=never, но нет полной уверенности, что всегда сработает и компилятор не решит, что он умнее....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, one_eight_seven said:

Именно так. На самом деле, такая функция не может быть неинлайновой,  потому что иначе будет ругань на множественное определение и ошибка компиляции.

А вот это уже додумывание )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, Forger said:

А вот это уже додумывание )

Я выше привёл ссылку на стандарт. Там это написано английским по белому.

2 minutes ago, jcxz said:

Это GCC? У меня IAR. И я про модификатор конкретных функций, а не ключ компилятору на всё подряд.

Да, это GCC. Причём, эта опция имеет меньший приоритет, чем атрибут always_inline. Есть опция noinline, которая исключает функцию из рассматриваемых для инлайна, но это опять же, может быть проигнорировано при оптимизации, и если нет побочных эффектов, оптимизатор всё равно может её заинлайнить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"Инлайн этот - странный предмет... Вроде бы есть, а вроде и нет":biggrin:

Интересно еще другое: в изобилии всех этих inline и его дендрофекальных помощников в лице noinline, always_inline (который то же самое, что force_inline, который то же самое, что inline), которые вроде как есть, но ничего не гарантируют, и их отсутствие тоже ничего не гарантирует... То зачем они вообще нужны? Напоминает электромашинку для детей до 2 лет - вроде ребенок думает типа сам едет, а на самом деле родители с пульта газуют:biggrin: Так и программист с тулчейном.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...