|
Как лучше писать |
|
|
|
Aug 5 2008, 06:42
|
Группа: Участник
Сообщений: 10
Регистрация: 4-05-08
Пользователь №: 37 271

|
Keil mVision.Соответственно, есть куча разных функций.Одни для одного,другие для другого, где то они пересекаюся и не редко.В общем, как обычно.Вот вопрос-стоит ли собирать их в разные си файлы и делать кучу extern-ов, или лучше все-таки без особой необходимости этого не делать.Может, надо искать золотую середину?Есть ли какие-нибудь критерии,кроме здравого смысла? На что это влияет?Спасибо
|
|
|
|
|
Aug 5 2008, 06:53
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Обычно всегда стараюсь чётко разделить программу на модули, как можно более автономные. Функции, описанные в модулях, выносим в h-файл, и в других модулях его подключаем. Всё как обычно. Переменные тоже желательно разделить, для внутримодульного употребления - static. Да это и не только для АРМ и Кейла, а вообще нормальный стиль программирования. Потом я беру, к примеру, модуль Indicator.c, перетаскиваю в новый проект и он без единой настройки сразу работает. А чтобы не было "кучи extern-ов", нужно в модуле группировать данные и функции для работы с этими данными. Чтобы не было глобальных пересечений и взаимосвязей.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Aug 5 2008, 07:22
|
Группа: Участник
Сообщений: 10
Регистрация: 4-05-08
Пользователь №: 37 271

|
Модульность-это хорошо.Я это, безусловно, пинимаю.Такой вопрос-если я забью на модульность и совместимость, получу ли я прирост скорости или там свободного места?
|
|
|
|
|
Aug 5 2008, 07:34
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(npopok @ Aug 5 2008, 11:22)  Такой вопрос-если я забью на модульность и совместимость, получу ли я прирост скорости или там свободного места? Встречный вопрос: а засчёт чего? Компилятор транслирует исходники функций в объектный код, линкер собирает из объектов файл прошивки. По большому счёту, им без разницы, в одном файле находятся функции или в 10. (20,50). Скорость и свободное место - понятия взаимоисключающие. Нужна скорость - inline и unrolling, соответственно теряем место. Не хватает места - обратная ситуация, приходится жертвовать скоростью.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Aug 5 2008, 07:49
|

Частый гость
 
Группа: Свой
Сообщений: 97
Регистрация: 26-05-05
Из: Киев, Украина
Пользователь №: 5 426

|
Советую почитать книгу "Анализ программного кода на примере проэктов Open Source" автор Диомидис Спинеллис. http://oz.by/books/more1011402.html
--------------------
Смотреть в себя, зреть муки свои, зная, что сам ты виновник мук - вот истинное страдание. Отладка / Софокл, "Аякс".
|
|
|
|
|
Aug 5 2008, 09:32
|
Группа: Участник
Сообщений: 10
Регистрация: 4-05-08
Пользователь №: 37 271

|
Последнее ,конечно, полезно, но вообще не в тему
|
|
|
|
|
Aug 5 2008, 09:37
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(MrYuran @ Aug 5 2008, 10:34)  Встречный вопрос: а засчёт чего? Например, компилятор может самостоятельно встроить функции, используемые только один раз и объявленные как static. Экономия на командах вызова, передаче параметров, прологе/эпилоге. Некторые функции содержат кода меньше, чем накладные расходы на ее вызов. Или функции-обертки, которые при встраивании вообще не генерят кода. Безусловное встраивание таких функций дает выигрыш и в объеме и в скорости. Если функция не static и тело ее в другом файле - компилятор не сможет ее встроить. Таким образом, некоторые функции модуля целесообразно выносить из .c в .h, добавляя к ним квалификатор static. Они могут потянуть за собой другие. Если же функция большая и используется дважды - получим обратный эффект. Такая оптимизация в любом случае происходит при помощи программиста, и порой в угоду читабельности и модифицируемости кода стоит некторые участки оставить неоптимальными. В противном случае придем у ручной правке ассемблерного кода после компилятора.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Aug 5 2008, 09:46
|
Участник

Группа: Новичок
Сообщений: 43
Регистрация: 27-07-06
Пользователь №: 19 152

|
Цитата(Kaplinsky @ Aug 5 2008, 11:49)  Советую почитать книгу Цена: 29 826 руб. А я бы не советовал. За такие деньги? Нифига себе - оупен сорс!
|
|
|
|
|
Aug 5 2008, 10:00
|

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

|
Цитата(MrYuran @ Aug 5 2008, 10:34)  Компилятор транслирует исходники функций в объектный код, линкер собирает из объектов файл прошивки. По большому счёту, им без разницы, в одном файле находятся функции или в 10. (20,50). Ну разница все-таки есть. Если все в одном файле, и функции объявлены как static. Компилятор может сделать более эффективный код (например повставлять инлайнов там где это не указано явно, повыбрасывать неиспользуемые функции, заменить "дальний" вызов на "ближний" для процессоров где это актуально и .т.п.). С т.з. оптимизации компилятору лучше сразу видеть весь код в одном файле, потому что линкер ничего оптимизировать не будет. Только читаемость когда "все в одном" будет никакой.
|
|
|
|
|
Aug 5 2008, 10:04
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(Duplex @ Aug 5 2008, 13:46)  Цена: 29 826 руб. Я уже наверно рассказывал байку. Едут мужики в Белоруссию в командировку. На поезде. Проводница заглядывает в купе: - чай будете? - Ну да... Взяли по чашечке. - С вас 120 рублей. Потом дошло, что беларусских. </offtop> 2 Сергей Борщ : я обычно сам ручками пишу __inline__, не надеясь на компилятор
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Aug 5 2008, 13:20
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(MrYuran @ Aug 5 2008, 10:53)  Обычно всегда стараюсь чётко разделить программу на модули, как можно более автономные. Функции, описанные в модулях, выносим в h-файл, и в других модулях его подключаем. Всё как обычно. Переменные тоже желательно разделить, для внутримодульного употребления - static. +1. Сам к этому пришёл, основываясь на горьком опыте. Программы стали значительно более читаемыми. И больше не надо держать в голове всё это хитросплетение из глобальных переменных и функций. Ещё одно правило - комментарий к каждой функции. Цитата(npopok @ Aug 5 2008, 11:22)  Модульность-это хорошо.Я это, безусловно, пинимаю.Такой вопрос-если я забью на модульность и совместимость, получу ли я прирост скорости или там свободного места? Забивание на модульность приведёт к менее читаемой программе, а в ней потери скорости/памяти возникнут сами собой из-за бардака. И вообще, начинать оптимизировать надо только после того, как необходимость оптимизации была доказана измерениями. Иначе это пустая трата времени. Конечно, это не отменяет того, что выбираемые решения и алгоритмы должны изначально быть реалистичными (к примеру, таблица синусов на 100 кБайт не влезет в МК с 32 кБайтами).
|
|
|
|
|
Aug 5 2008, 13:34
|
Участник

Группа: Новичок
Сообщений: 43
Регистрация: 27-07-06
Пользователь №: 19 152

|
Цитата(MrYuran @ Aug 5 2008, 14:04)  Потом дошло, что беларусских. Доллары тоже разных стран бывают, но люди сразу их обозначают. Доллар США - пишут USD. Тут тоже могли бы писать - белорубль.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|