|
Много мелких функций или одна большая? |
|
|
|
Feb 16 2011, 06:42
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Само указание ключевого слова inline в декларации функции является подсказкой/предложением компилятору встроить тело функции в точке вызова. Но компилятор имеет полное право сделать по своему усмотрению. Это стандартное поведение. Некоторые компиляторы вводят расширения (само собой нестандартные) для управления поведением компилятора. Про GCC уже сказали выше, у IAR в документации недвусмысленно сказано: Цитата #pragma inline[=forced]
Specifying #pragma inline=forced disables the compiler’s heuristics and forces inlining. If the inlining fails for some reason, for example if it cannot be used with the function type in question (like printf), an error message is emitted. Т.е. при использовании этой прагмы компилятор обязан встроить функцию. Если он не может по техническим причинам этого реализовать, он должен выдать сообщение об ошибке. Это весьма полезное свойство для embedded области применения.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Feb 16 2011, 08:55
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(_Pasha @ Feb 16 2011, 12:54)  Что характерно - чем вопрос элементарнее, тем дискуссия более оживленная  А это всё в точности по Паркинсону ("Законы Паркинсона", занятная книжка). Там был на эту тему пример про обсуждение на совете директоров трех вопросов: 1. про приобретение какого-то очень дорогостоящего оборудования (на миллионы); 2. строительство навеса для стоянки велосипедов сотрудников; 3. сколько стаканчиков для кофе класть в кофейный автомат. По первому вопросу затраты времени 10 минут, по второму - минут 40, и по третьему - три часа. Объяснение логичное: чем проще вопрос, тем больше народу в нём разбирается. И у каждого есть мнение.  Кстати, вопрос про инлайны не такой простой для начинающих, как может показаться. Инлайновые функции должны удовлетворять ряду требований, и для них делаются определённые послабления. Кроме того, обсуждаемые расширения тоже несут с собой часть нюансов использования. Поэтому я бы не считал обсуждение всего этого ненужным.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Feb 17 2011, 14:44
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(GYUR22 @ Feb 14 2011, 22:22)  имхо: Результат в моем случае проверить сложно т.к. размер кода - будет один и тотже -функции используются по разу а скорость отклика - уарта мне точно померять пока не представляется возможным - точность +/- 1 ms уже не устроит Ну так забейте на inline если оно настолько некритично для вашего проекта. Кстати inline'нинье функций далеко не гарантия наиболее высокой скорости исполнения. Например, в процессорах с кеш памятью команд - бездумное инлайнинье там и сям приведет только к замедлению за счет раздувания кода при константном объеме кеш памяти. Цитата(demiurg_spb @ Feb 15 2011, 19:43)  Если разить вашу теорию, то и данные предназначенные для помещения в секции EEPROM (это при помощи атрибутов в gcc происходит) ИНОГДА могут оказаться в другой секции. Это абсурд! обилие прагм и атрибутов в проекте - это говнокод, а не абсурд, и - кстати таки да данные могут оказаться совсем не в той секции где ожидаешь, при переносе такого проекта на другой проц.
|
|
|
|
|
Feb 17 2011, 19:18
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(defunct @ Feb 17 2011, 17:44)  Ну так забейте на inline если оно настолько некритично для вашего проекта. Кстати inline'нинье функций далеко не гарантия наиболее высокой скорости исполнения. Например, в процессорах с кеш памятью команд - бездумное инлайнинье там и сям приведет только к замедлению за счет раздувания кода при константном объеме кеш памяти. обилие прагм и атрибутов в проекте - это говнокод, а не абсурд, Идеологически согласен. Кстати, Вы видели в моём примере много прагм и атрибутов? Человек спросил как это сделать - я дал однозначный рецепт. Потом сюда приплели даже микрософтовский компилятор и кеш инструкций, хотя тема находится в подфоруме микроконтроллеры/AVRи вопрос касался avr-gcc... Цитата и - кстати таки да данные могут оказаться совсем не в той секции где ожидаешь, при переносе такого проекта на другой проц. Какие Ваши предложения на сей счёт? Отказаться от использования PROGMEM, EEMEM, ISR и вообще не включать компьютер? Атрибуты в gcc - это почти что основополагающий механизм в случае кросс-компиляции для avr. Если Вы внимательно читали мои посты, то могли бы подметить, что я рекомендовал оставить лишь квалификатор static, ибо это и необходимо и достаточно для локальных функций.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 17 2011, 20:31
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(demiurg_spb @ Feb 17 2011, 22:18)  ... я рекомендовал оставить лишь квалификатор static, ибо это и необходимо и достаточно для локальных функций. Да static для локальных функций это просто "хороший тон", чтобы не "заси...ть" пространство имен большого проекта, а вовсе не какая-то необходимость. С одной стороны - хорошо, с другой, их не найдешь в map файле, если понадобится найти точку зависания программы. То, что static - помощь компилятору в деле инлайнинга, вопрос спорный. В одном компиляторе может так, в другом этак.
|
|
|
|
|
Feb 19 2011, 06:09
|
Местный
  
Группа: Участник
Сообщений: 406
Регистрация: 1-03-06
Пользователь №: 14 821

|
Цитата(GYUR22 @ Feb 11 2011, 13:39)  Есть одна большая функция в программе - которую можно поделить на много мелких ... Вопрос как выгоднее по скорости исполнения - разделить ее на 18 мелких (по смыслу) или оставить как есть? ИМХО Разделяется по функциональности. Например функция: check_port_a() { i2c_byte_read(); uart2_send_data(); } на мой взгляд выглядит не плохо. Что плохо бы смотрелось, это пример: check_port_a() { start_i2c_bit(); set_i2c_address(); set_i2c_cmd_byte(); get_i2c_byte(); stop_i2c_bit(); uart2_send_data(); } По скорости будет примерно одинаково.
Сообщение отредактировал andron86 - Feb 19 2011, 06:13
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|