ViKo 1 15 ноября, 2012 Опубликовано 15 ноября, 2012 · Жалоба Об этом уже говорили, и выходит, что нельзя. Или все же есть способ? Или компилятор (Keil для Cortex) не дурак, сам встроит функцию, если она окажется небольшой? Например, такой: inline bool Timer_check(void) { return (TIM6->SR); // Check Update Interrupt Flag in Status } С inline, кстати, не компилируется. Или надо было ее написать в виде макро? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 15 ноября, 2012 Опубликовано 15 ноября, 2012 · Жалоба Или надо было ее написать в виде макро? Написать static inline и расположить в .h файле Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 8 15 ноября, 2012 Опубликовано 15 ноября, 2012 · Жалоба а как компилятор узнает, какой код ему инлайнить? в h файле ее можно описать и инклюдить и в этот файл и в другой Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 15 ноября, 2012 Опубликовано 15 ноября, 2012 · Жалоба Если последний вопрос ко мне, то у меня есть заголовочный файл (упрощенно говоря) fun.h, который подключается к main.c файлу, и где был описан прототип функции: bool Timer_check(void); А если добавить inline и к прототипу, и к определению функции, то не компилируется. А если всю функцию перенести в заголовочный файл fun.h, то работает, независимо, static или без... только размерчик получился больше (!), чем когда функция была определена в fun.c файле. Code = 29744 вместо 29224. upd. не ту функцию показал, поправил. P.S. А если добавляю inline только к прототипу или к определению, то компилируется, но уже с размером 29232! (А-а-а-а-а! зачем же я пьянствовал вчера, надо было бы сегодня!) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 15 ноября, 2012 Опубликовано 15 ноября, 2012 · Жалоба размерчик получился больше (!), чем когда функция была определена в fun.c файле. Code = 29744 вместо 29224. Дался Вам этот кейл... В ГЦЦ static inline __attribute__((always_inline)) void somefunc(const int argument) И всё. Ничего не растет без спроса у хозяина битов :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 15 ноября, 2012 Опубликовано 15 ноября, 2012 · Жалоба Дался Вам этот кейл... В ГЦЦ Но функция в другом файле находится не может? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 15 ноября, 2012 Опубликовано 15 ноября, 2012 · Жалоба Дался Вам этот кейл... В ГЦЦ И в Keil есть такие штуки (эквивалентны): __attribute__((always_inline)) __forceinline Добавляются к прототипу функции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 8 15 ноября, 2012 Опубликовано 15 ноября, 2012 · Жалоба И в Keil есть такие штуки (эквивалентны): __attribute__((always_inline)) __forceinline Добавляются к прототипу функции. это к функциям в файле относится, у gcc тоже есть always_inline http://gcc.gnu.org/onlinedocs/gcc/Inline.html Если последний вопрос ко мне, то у меня есть заголовочный файл (упрощенно говоря) fun.h, который подключается к main.c файлу, и где был описан прототип функции: для инлайна ему нужен не прототип, а код функции. вопрос был риторический я для каких-то извращенных архитектур, где вообще стека нету, сталкивался с тем, что инлайлинье делает линкер при сборке "экзешника", но это исключительное извращение, по-моему в нынешних компиляторах нет такой фазы, чтобы шарится по всем объектникам и искать там коды для инлайнов ----------- btw: static к определению фукнции (или переменной) дописывают чтобы не загаживать пространство имен, она как бы локальная получается и линкер такой функции не видит (это для больших проектов полезно) у фукнции или не стековой (обычно называют глобальной) переменной это больше ни на что не влияет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 15 ноября, 2012 Опубликовано 15 ноября, 2012 · Жалоба это к функциям в файле относится, у gcc тоже есть always_inline А зачем они тогда вообще нужны, чем inline не годится? А, наверное, задавать принудительно, даже если это и не оптимально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 15 ноября, 2012 Опубликовано 15 ноября, 2012 · Жалоба А зачем они тогда вообще нужны, чем inline не годится? А, наверное, задавать принудительно, даже если это и не оптимально. Патамушо always_inline не помещает тело функции в объектник если функция ни разу не вызывалась. А без него - помещает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 15 ноября, 2012 Опубликовано 15 ноября, 2012 · Жалоба Патамушо always_inline не помещает тело функции в объектник если функция ни разу не вызывалась. А без него - помещает. объектник - это одно. Линкер разве помещает ее в код, если она не вызывалась ни разу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 15 ноября, 2012 Опубликовано 15 ноября, 2012 · Жалоба объектник - это одно. Линкер разве помещает ее в код, если она не вызывалась ни разу? Я неправильно выразился. Инлайнит независимо от уровня оптимизации, так по стандарту. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 16 ноября, 2012 Опубликовано 16 ноября, 2012 · Жалоба по-моему в нынешних компиляторах нет такой фазы, чтобы шарится по всем объектникам и искать там коды для инлайновНе совсем так. Есть режим компиляции (в gcc он называется LTO, в других компиляторах whole program optimization или нечто подобное), который позволяет заинлайнить функцию, даже если ее тело находится в другой единице компиляции и даже если ей там inline не писали. Но реализуется это конечно не поиском кода в объектниках (в этом режиме в объектниках вообще кода может и не быть) :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 16 ноября, 2012 Опубликовано 16 ноября, 2012 · Жалоба А если всю функцию перенести в заголовочный файл fun.h, то работает, независимо, static или без... Стоит подключить fun.h к нескольким модулям, и сразу станет понятен смысл static. Без него линкер выдаст ошибку "Multiple definition" - одноименный объект создается в разных модулях. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 16 ноября, 2012 Опубликовано 16 ноября, 2012 · Жалоба Стоит подключить fun.h к нескольким модулям, и сразу станет понятен смысл static. Без него линкер выдаст ошибку "Multiple definition" - одноименный объект создается в разных модулях. Это заменяет #ifndef FUN_H #define FUN_H ... #endif ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться