реклама на сайте
подробности

 
 
> #define FUNCTION() vs. inline Function(), второе более "модно", а почему?
ViKo
сообщение Sep 3 2015, 08:13
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Собственно, весь вопрос в заголовке темы. Помню фразы, что в C++ роль макроопределений много меньше, чем в C. Стало быть, надо ориентироваться на inline функции?

К примеру, задать бит в порту можно с одинаковым успехом обоими вариантами. Для единообразия пошел по второму:
Код
__forceinline void FpRq_off(void)
{
  GPIOA->BSRR = FPRQ_H;
}

Но, скажем, функцию задержки, вычисляющую начальное значение счетчика в зависимости от времени, делаю комбинацией макрофункции со встроенной функцией.

Код
#define DELAY(VALUE, UNIT)    \
  DelayFourCycles(((VALUE) * UNIT * (SYSCLK / 1000000) + 3999) / 4000)

#pragma push
#pragma O3
__forceinline void DelayFourCycles(uint32_t FC)
{
__asm {
LOOP:
    SUBS FC, FC, #1
    BNE LOOP
  }
}
#pragma pop


Хочу просветления. Или уже...? rolleyes.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Valentine Logino...
сообщение Sep 4 2015, 05:39
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 7-04-10
Из: Пушкино
Пользователь №: 56 462



Inline-функции, как было сказано, позволяют сделать меньше ошибок: проверка типов + отладка в пошаговом режиме. Всегда можно вспомнить пример про вызов макроса MAX(a++, cool.gif.

Как сделать в виде функции макрос ТС зависит от того как определены PORTA, PORTB etc. Скорее всего static inline void GpioConf(GPIO_TypeDef port, uin32_t...) {...}. Не?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 4 2015, 07:37
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Valentine Loginov @ Sep 4 2015, 08:39) *
Как сделать в виде функции макрос ТС зависит от того как определены PORTA, PORTB etc. Скорее всего static inline void GpioConf(GPIO_TypeDef port, uin32_t...) {...}. Не?

Немного некомфортно, что inline функцию нужно вставлять в заголовочный файл *.h, а не в *.c. Чтобы ее можно было использовать в другом файле.
А сколько переменных можно передать в функцию? ничего не треснет? biggrin.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 4 2015, 08:30
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (ViKo @ Sep 4 2015, 10:37) *
Немного некомфортно, что inline функцию нужно вставлять в заголовочный файл *.h, а не в *.c. Чтобы ее можно было использовать в другом файле.

А что, с макросами как-то иначе sm.gif. Смущает .h? так назовите .c - какие проблемы?
QUOTE
А сколько переменных можно передать в функцию? ничего не треснет? biggrin.gif

Треснет - стек, если его размера не хватит для размещения всех передаваемых переменных.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 4 2015, 08:38
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(zltigo @ Sep 4 2015, 11:30) *
А что, с макросами как-то иначе sm.gif. Смущает .h? так назовите .c - какие проблемы?

Э-э, себя-то не обманешь... include так include. Я не говорю, что прямо воротит, просто не тем цветом в Notepad++ раскрашивает. rolleyes.gif
Цитата
Треснет - стек, если его размера не хватит для размещения всех передаваемых переменных.

Там не будет использоваться стек, эти переменные заменяются макроопределениями.
Код
/*! GPIO Mode Type */
typedef enum {
  MD_IN,            //!< Input *
  MD_GO,            //!< General purpose output
  MD_AF,            //!< Alternate function
  MD_AN                //!< Analog  
} GPIO_MODE_t;
и т.д.

Я так думаю.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 4 2015, 09:11
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (ViKo @ Sep 4 2015, 11:38) *
Э-э, себя-то не обманешь... include так include. Я не говорю, что прямо воротит, просто не тем цветом в Notepad++ раскрашивает. rolleyes.gif

Не понимаю в чем обман.
QUOTE
Там не будет использоваться стек, эти переменные - макроопределения.

Вы это как-бы подумайте, прежде, чем такое писать. Функции глубоко безразлично, она по любому получает переменные в стеке или/и в регистрах.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Sep 4 2015, 09:22
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(zltigo @ Sep 4 2015, 10:11) *
Вы это как-бы подумайте, прежде, чем такое писать. Функции глубоко безразлично, она по любому получает переменные в стеке или/и в регистрах.


Ну, если функция успешно заинлайнена, зачем ей передавать аргументы (особенно через стек)?
Кроме того, хороший компилятор может сам решить, заинлайнить ли ему обычную функцию или нет. Если функция объявлена как static ее может быть выгодно подставить в вызывающую функцию целиком, как раз с целью избавления от передачи лишних аргументов...

ТС - вы не меняйте все свои макросы на inline функции, это не одно и то же.. Это разные вещи, и область применения у них разная. Кроме того, с inline функциями могут быть проблемы. Например, криворукий программист объявит inline функцию в заголовке, включит его в несколько модулей и в одном из модулей попытается получить адрес этой функции. В зависимости от кривизны компилятора это может привесли к забавным последствиям.

Сообщение отредактировал CrimsonPig - Sep 4 2015, 09:26
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 4 2015, 09:44
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (CrimsonPig @ Sep 4 2015, 12:22) *
Ну, если функция успешно заинлайнена, зачем ей передавать аргументы (особенно через стек)?

В вопросе НЕ БЫЛО про заинлайненую функцию. О передаче арнгментов ЗАИНЛАЙНЕННОЙ функции говорить вообще бесмысленно, ибо нет уже ни функции, ни аргументов.
Так-что и ответ не про занлайненную.
QUOTE
ТС - вы не меняйте все свои макросы на inline функции....

Поддержу.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ViKo   #define FUNCTION() vs. inline Function()   Sep 3 2015, 08:13
- - dimka76   Например с точки зрения удобства. С инлайн фукциям...   Sep 3 2015, 08:25
|- - zltigo   QUOTE (dimka76 @ Sep 3 2015, 11:25) С инл...   Sep 3 2015, 11:58
- - ViKo   Еще один пример. Я не представляю, как сделать это...   Sep 3 2015, 08:39
- - CrimsonPig   Цитата(ViKo @ Sep 3 2015, 09:13) Собствен...   Sep 3 2015, 09:19
|- - ViKo   Цитата(CrimsonPig @ Sep 3 2015, 12:19) Ва...   Sep 3 2015, 10:31
- - _4afc_   В Watcom C inline не всегда инлайнились если inlin...   Sep 3 2015, 09:34
||- - ViKo   Цитата(zltigo @ Sep 4 2015, 12:44) В вопр...   Sep 4 2015, 09:50
|- - ViKo   Цитата(zltigo @ Sep 4 2015, 12:11) Функци...   Sep 4 2015, 09:35
|- - CrimsonPig   Цитата(ViKo @ Sep 4 2015, 10:35) Сейчас м...   Sep 4 2015, 09:51
||- - ViKo   Цитата(CrimsonPig @ Sep 4 2015, 12:51) Ну...   Sep 4 2015, 09:55
||- - CrimsonPig   Цитата(ViKo @ Sep 4 2015, 10:55) Я не вол...   Sep 4 2015, 10:07
|- - zltigo   QUOTE (ViKo @ Sep 4 2015, 12:35) И что, i...   Sep 4 2015, 10:18
|- - Dog Pawlowa   Цитата(zltigo @ Sep 4 2015, 13:18) В идеа...   Sep 6 2015, 18:46
- - ViKo   А я проверил. Всё то же, inline функция GPIO_conf(...   Sep 7 2015, 09:03
- - Valentine Loginov   Если много аргументов - передавайте указатель на с...   Sep 10 2015, 07:02


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 01:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01532 секунд с 7
ELECTRONIX ©2004-2016