xvr 12 3 декабря, 2010 Опубликовано 3 декабря, 2010 · Жалоба void Combo(void) { Control(); Indication(); } Без комментариев. The Best :) Еще один коментарий - если компилятор достаточно умный, то он из функции Combo сделает именно то, что было нужно ТС. Ну, может быть, с оверхедом на один jmp (И даже для не статических функций Control и Indication) PS. Пишите на FORTRAN'е - там это можно средствами языка Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanya 4 3 декабря, 2010 Опубликовано 3 декабря, 2010 · Жалоба PS. Пишите на FORTRAN'е - там это можно средствами языка Или на Форте. Только там такая задача почти лишена смысла... Вот один раз только понадобилось для использования части (хвоста) ядреного слова. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 3 декабря, 2010 Опубликовано 3 декабря, 2010 · Жалоба Прокомментирую сам. Квалификатор static будет иметь смысл, если я эти функции заброшу в отдельный файл. Таких функций у меня несколько десятков, что ж, мне, столько файлов создавать? Не вижу смысла. Пардон, не было времени на развернутый ответ. void Combo(void); void Control(void); void Indication(void); //............................................... static void Control_prim(void); static void Indication_prim(void); Имеем заготовки для того чтобы контрол и индикация вызывались как извне так и максимально оптимизированно void Combo(void) { Control_prim(); Indication_prim(); } void Control(void) { Control_prim(); } void Indication(void); { Indication_prim(); } Теперь великий смысел оберток, надеюсь понятен. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 3 декабря, 2010 Опубликовано 3 декабря, 2010 · Жалоба Теперь великий смысел оберток, надеюсь понятен. :) Увы... :crying: Не могли бы вы словами описать, за счет чего будет оптимизация. Пока что вижу разрастание кода... Как будет у меня: int main(void) { ... Control(); Indication(); ... Indication(); } void Control(void) { ... } void Indication(void) { ... } Другой вариант: int main(void) {... Control(); ... Indication(); } void Control(void) { ... Indication(); } void Indication(void) { ... } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 3 декабря, 2010 Опубликовано 3 декабря, 2010 · Жалоба Пока что вижу разрастание кода... За счет разворачивания статических функций. Запретите инлайнизацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 3 декабря, 2010 Опубликовано 3 декабря, 2010 · Жалоба Хм...логично. Тогда напрашивается вопрос - и как жить? :crying: Например, так, без точки с запятой после макрофункции, хватит и ПРОПИСНЫХ_БУКВ_СО_СКОБКАМИ() #define I2C_CLOCK() {NOP(); SCL = 1; NOP(); SCL = 0;} if (...) I2C_CLOCK() else return; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 3 декабря, 2010 Опубликовано 3 декабря, 2010 · Жалоба Например, так, без точки с запятой после макрофункции,Потом почесали за ухом и решили, что в процессе кования программы макрос разросся и лучше сделать из него обычную функцию. И помчались вставлять точку с запятой везде, где было использование этого макроса. И все ради чего? Ради того, чтобы по религиозным соображениям не использовать конструкцию do {} while(0) ? Да пожалуйста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 3 декабря, 2010 Опубликовано 3 декабря, 2010 · Жалоба Собсна делов-то: #define Begin___Macro do{ #define End___Macro }while(0); И даже самый страшный и больной компилер пойдет туда, куда нада. ЗЫ: если дописать break;}while(0); например По сабжу: вообще-то логика организации программ на сях отличается от асмового. Например, если завести нечто типа машины Даффа и расположить жизненно важные части по раз и навсегда определенному приоритету, типа void system(char prio) { switch(prio) { case 0: remote_command(); case 1: indication(); case 2: control(); case 3: critical(); } } можно вызывать такое отовсюду и отрубать не актуальные функции входным параметром - приоритетом. Хотя я приверженец protothreads... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 3 декабря, 2010 Опубликовано 3 декабря, 2010 · Жалоба Потом почесали за ухом и решили, что в процессе кования программы макрос разросся и лучше сделать из него обычную функцию. И помчались вставлять точку с запятой везде, где было использование этого макроса. Когда я захочу вместо макроса применить функцию, я даже имени такого не оставлю, а изменю, согласно своим "религиозным" убеждениям. Заменить не трудно, при желании, можно даже автоматом. Я стараюсь не плодить лишних сущностей. можно вызывать такое отовсюду и отрубать не актуальные функции входным параметром - приоритетом. Об этом написал MrYuran в посте №3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 3 декабря, 2010 Опубликовано 3 декабря, 2010 · Жалоба Об этом написал MrYuran в посте №3 Переключатель - это еще не все. Вопрос, где break ставить, и ставить ли вообще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 3 декабря, 2010 Опубликовано 3 декабря, 2010 · Жалоба Переключатель - это еще не все. Вопрос, где break ставить, и ставить ли вообще. Да, вы правы. В вашем методе есть смысл (именно так я писал на ассемблере, но без параметра - приоритета). Только все равно перед вызовом такой функции нужно готовить параметр. И внутри его проверять. Я лучше буду вызывать функции независимо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 27 3 декабря, 2010 Опубликовано 3 декабря, 2010 · Жалоба Да, вы правы. В вашем методе есть смысл (именно так я писал на ассемблере, но без параметра - приоритета). Только все равно перед вызовом такой функции нужно готовить параметр. И внутри его проверять. Если функции инлайновые, а параметр константный, то компилятор сразу подставит по месту, без всяких лишних проверок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 3 декабря, 2010 Опубликовано 3 декабря, 2010 · Жалоба то компилятор сразу подставит по месту, без всяких лишних проверок. нормальный компилятор :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 3 декабря, 2010 Опубликовано 3 декабря, 2010 · Жалоба Если функции инлайновые, а параметр константный, константный, это const? У меня есть некоторые сомнения по поводу const. Тут наверно правильнее сказать как-то так: определен на этапе компиляции. Но смысл Вашего поста понятен...Это я так, придираюсь )) Хотя, действительно продвинутый компилятор наверное и с const сработается...но это только догадки.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 4 декабря, 2010 Опубликовано 4 декабря, 2010 · Жалоба константный, это const? У меня есть некоторые сомнения по поводу const. Тут наверно правильнее сказать как-то так: определен на этапе компиляции. Но смысл Вашего поста понятен...Это я так, придираюсь )) void dispatch(const char prio) { switch(prio) { // doobeedoo } } void otherfunc(char param) { dispatch(0); // тут оптимизирует dispatch(param);// тут нет char pp=1; dispatch(pp);// тут опять(снова) да! } где-то так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться