777777 0 11 марта, 2009 Опубликовано 11 марта, 2009 · Жалоба и де там обсуждается "типичное заблуждение" ? расходы как минимум на конструкторы/деструкторы, виртуальную таблицу, ну и все то, что приносит с собой дженерализейшн. Никаких лишних расходов там нет, то, что делают конструкторы/деструкторы, нужно делать в сишной программе, но там ты можешь забыть, а в С++ компилятор сделает это автоматически. Если виртуальный функций нет, то и виртуальной таблицы не будет. Опять же, если в сишной программе ты будешь делать что-нибудь наподобие перехода по таблице указателей, то это фактически то же самое с теми же расходами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 11 марта, 2009 Опубликовано 11 марта, 2009 · Жалоба и де там обсуждается "типичное заблуждение" ? расходы как минимум на конструкторы/деструкторы, виртуальную таблицу, ну и все то, что приносит с собой дженерализейшн. Еще раз повторюсь: даже если небольшой оверхед и есть, это мне не помешало поместить в ATmega16 ОСь + прикладную программу. Все на Си++. Сейчас занимаюсь реалтаймовским приложением. Тоже на Си++, без ОСи (она там просто не нужна). Для ATmega168. Я в свое время также и про Си считал. Только на ассемблере работал. Пока не попробывал. Удобств было... словами не описать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vik0 0 11 марта, 2009 Опубликовано 11 марта, 2009 · Жалоба расходы как минимум на конструкторы/деструкторы, виртуальную таблицу, ну и все то, что приносит с собой дженерализейшн. У Страуструпа есть весьма интересная книжка - "Дизайн и эволюция языка С++". Не читали? Рекомендую. Одна из ключевых идей книги - "вы не платите за то, что не используете". Не используете виртуальные функции - не будет никакой таблицы. Не инициализируете члены класса - не будет никаких лишних конструкторов (default ctor, инициализирующий члены default значениями, нормальный компилятор успешно соптимизирует). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 11 марта, 2009 Опубликовано 11 марта, 2009 · Жалоба У Страуструпа есть весьма интересная книжка - "Дизайн и эволюция языка С++". Не читали? Рекомендую. Одна из ключевых идей книги - "вы не платите за то, что не используете".Очень правильная "в принципе" идея, только в реальности С++ слегка провоцирует на дополнительные накладные расходы, предоставляя взамен кучу не всегда нужных фич. А вот людей которые могут не купиться на эти ненужные вещи не так уж и много... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vik0 0 11 марта, 2009 Опубликовано 11 марта, 2009 · Жалоба Очень правильная "в принципе" идея, только в реальности С++ слегка провоцирует на дополнительные накладные расходы, предоставляя взамен кучу не всегда нужных фич. А вот людей которые могут не купиться на эти ненужные вещи не так уж и много... Согласен. Все упирается в поиск баланса - чем вы готовы пожертвовать ради упрощения процесса разработки. Правда это подразумевает неплохое (как минимум) знание языка. С++ - сложный инструмент. А для эффективного использования любого сложного инструмента необходимо его хорошее знание и понимание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 12 марта, 2009 Опубликовано 12 марта, 2009 · Жалоба Еще раз повторюсь: даже если небольшой оверхед и есть, это мне не помешало поместить в ATmega16 ОСь + прикладную программу. Все на Си++. Сейчас занимаюсь реалтаймовским приложением. Тоже на Си++, без ОСи (она там просто не нужна). Для ATmega168. Я в свое время также и про Си считал. Только на ассемблере работал. Пока не попробывал. Удобств было... словами не описать. Верю. И в Запорожец можно человек 7 натолкать. Вопрос - еффективно ли ето? Скажите пожалуйста, что вас побудило использовать C++ a не C, и какие его особеености Вы использовали( try/catch, templates, STL, (design patterns maybe), virtual functions, operator overloading, .. etc) Интересно будет послушать. У Страуструпа есть весьма интересная книжка - "Дизайн и эволюция языка С++". Не читали? Рекомендую. Одна из ключевых идей книги - "вы не платите за то, что не используете". Не используете виртуальные функции - не будет никакой таблицы. Не инициализируете члены класса - не будет никаких лишних конструкторов (default ctor, инициализирующий члены default значениями, нормальный компилятор успешно соптимизирует). Нет не читал. Не читаю на русском техническую литературу. подозреваю, что ето "The Annotated C++ Reference Manual".. Лежит на работе. Почитываю иногда главки. все вместе нет смысла читать. Надо будет домой забрать, пока не украли. А че там? По сути - если мы все выбросим - ето будет C, только написанный в формате C++. Собственно тут 2 вопроса - почему хорош C++ и почему он плох с мелкими микроконтроллерами.. 1. С появлением C++ стало легче разрабатывать большие проекты - можно все разбить на обьекты, менять их, легко видна структура программы, и т.д. 2. Почему он плох для мелкоконтроллеров: он скрывает связь с ресурсами - например внутри конструктора может быть другой new, что сразу не очевидно. Операторы могут быть переопределены, и так далее.. Не очень прозрачен. Деструкторы - надо помнить что при выходе из скопа вызывается деструктор и т.д. Не, я по жизни и на работе в основном на C++ программирую, но когда дома на мелкоконтроллерах - лучше С Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 12 марта, 2009 Опубликовано 12 марта, 2009 · Жалоба Верю. И в Запорожец можно человек 7 натолкать. Вопрос - еффективно ли ето? В запорожце сколько сидячих мест? 4? Ну так зачем же туда 7 пихать? В ATmega16 сколько памяти программ? 16Кб? Ну так если мое приложение + ОСь (на Си++) занимают 8 Кб памяти программ и 500 байт ОЗУ (используются буфера, много переменных), то кто мешает мне программировать на Си++? Я же не пытаюсь запихать туда более 16 Кб. Скажите пожалуйста, что вас побудило использовать C++ a не C, и какие его особеености Вы использовали( try/catch, templates, STL, (design patterns maybe), virtual functions, operator overloading, .. etc) Интересно будет послушать. Использовать Си++ меня побудила ОС scmRTOS. Увидев, что он успешно применяется для микроконтроллеров подобного класса, я решил что буду его применять в своей работе. Какие особенности использовал? Так я же ссылку давал, там все есть. Ну вот, хотябы это: http://electronix.ru/forum/index.php?s=&am...st&p=548053 http://electronix.ru/forum/index.php?s=&am...st&p=548100 http://electronix.ru/forum/index.php?s=&am...st&p=548240 В последнем проекте активно использую наследование. Т.е. когда один класс наследуется другим. Очень удобно. 2. Почему он плох для мелкоконтроллеров: он скрывает связь с ресурсами - например внутри конструктора может быть другой new, что сразу не очевидно. Чем это плохо и почему только для МК? На обычном IBM PC оперативы немеренно и бездумное использование new приветствуется, подумаешь пропадет пара сотен МБ? :rolleyes: Операторы могут быть переопределены, и так далее.. Опять же, чем это плохо именно для МК? Не очень прозрачен. Ну вот :crying: Деструкторы - надо помнить что при выходе из скопа вызывается деструктор и т.д. Ага, а еще надо помнить, что при создании объекта вызваются конструкторы и при вызове обработчика прерывания нужно сохранять SREG :rolleyes: Конструктор и деструктор можно не определять в классе, тогда ничего вызваться не будет. Деструктор, как правило вообще редко применяется (ИМХО). А вот конструктор - это сплошная выгода. Создаешь объект и не заботишься о вызове функции на подобии Init(), конструктор все сам сделает. Чем плохо? Или вручную, или автоматом. Ну елки-палки, это же неубедительно звучит. Чем это снова плохо именно для МК? Не, я по жизни и на работе в основном на C++ программирую, Для ПК? но когда дома на мелкоконтроллерах - лучше С А почему не АСМ, ведь на нем более оптимально можно написать? Си не очень прозрачен, добавляет свои навороты, оптимизацию, решает за программиста, где и что разместить АСМ в этом плане гораздо лучше! В общем это юмор. А если серьезно, Вы попробуйте Си++ на МК. Глядишь, и сомнения пропадут, зато получите мощный инструмент на 8 битной платформе. Ну и на последок: конечно, голову никто не отменял. Укладывать все возможности Си++ на AVR никто не собирается, но некоторые возможности почему бы не использовать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vik0 0 12 марта, 2009 Опубликовано 12 марта, 2009 · Жалоба Нет не читал. Не читаю на русском техническую литературу. подозреваю, что ето "The Annotated C++ Reference Manual".. Нет, я говорю о The Design and Evolution of C++ А че там? История развития языка с подробным описанием того, почему основные функции реализованы именно так, а не иначе. он скрывает связь с ресурсами - например внутри конструктора может быть другой new что сразу не очевидно. Ага. А на чистом "С" внутри функции типа InitSomething() не может быть вызвана InitSomethingElse() и, даже (о ужас!!), malloc??... Операторы могут быть переопределены... Ну и отлично! Лично я предпочту написать: complex a, b, c, d; .... a += b - c*d; а не: a = complex_add(a, complex_sub(b, complex_mul(c, d))); ...и получить на выходе тот же самый код. Деструкторы - надо помнить что при выходе из скопа вызывается деструктор и т.д. Ну и отлично! Лично я предпочту написать: int DoSomething() { CriticalSection cs; ...bla-bla-bla... if (foo) return 1; ...bla-bla-bla... if (bar) return 2; ...bla-bla-bla... if (baz) return 3; ...bla-bla-bla... return 0; } а не: int DoSomething() { DisableInterrupts(); ...bla-bla-bla... if (foo) { RestoreInterrupts(); return 1; } ...bla-bla-bla... if (bar) { RestoreInterrupts(); return 2; } ...bla-bla-bla... if (baz) { RestoreInterrupts(); return 3; } ...bla-bla-bla... RestoreInterrupts(); return 0; } ...и получить на выходе (извините за самоцитирование :laughing: ) тот же самый код. Ну и на последок: конечно, голову никто не отменял. Укладывать все возможности Си++ на AVR никто не собирается, но некоторые возможности почему бы не использовать? +100 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 13 марта, 2009 Опубликовано 13 марта, 2009 · Жалоба Деструкторы - надо помнить что при выходе из скопа вызывается деструктор и т.д. Как раз наоборот. Когда ты пишешь на Си, то надо помнить, что всю память, которую ты выделяешь, после использования надо освободить. А в С++ (если, конечно, классы спроектированы правильно) память выделяется в конструкторе, а в деструкторе автматически освобождается. Так же с любой другой инициализацией/освбождением. Главное - правильно споектировать класс чтобы он точно отражал суть описываемого объекта. Так что никакого оверхеда в С++ нет - все что он делает, нужно делать и в Си, но там это должен далеть сам программист вручную и ни о чем не забыть, а в С++ это сделается автоматически. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 13 марта, 2009 Опубликовано 13 марта, 2009 · Жалоба Ну и отлично! Лично я предпочту написать: ... а не: ... ...и получить на выходе (извините за самоцитирование :laughing: ) тот же самый код. Вы просто не умеете готовить plain C: int DoSomething() { UREG result=0; ATOMIC_BLOCK(_нужный_режим_) { ...bla-bla-bla... if (foo) { result=1;continue; } ...bla-bla-bla... if (bar) { result=2;continue; } ...bla-bla-bla... if (baz) { result=3;continue; } } return result; } Как видите, все намного проще :) ЗЫ: ATOMIC_BLOCK можно покурить в инклудах гнуся. Кстати, в гнусе можно и прямо return 1 делать в ветках. Но я не сторонник пользовать гнутые фичи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 13 марта, 2009 Опубликовано 13 марта, 2009 · Жалоба Вы просто не умеете готовить plain C:plain или непереносимые расшинения гнуся? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 13 марта, 2009 Опубликовано 13 марта, 2009 · Жалоба или непереносимые расшинения гнуся? Где Вы увидели в моем примере непереносимые расширения? ;) Я специально обратил внимание, что в гнусе еще проще, но непереносимо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vik0 0 13 марта, 2009 Опубликовано 13 марта, 2009 · Жалоба Вы просто не умеете готовить plain C: Умею. Но просто мне больше по вкусу С++ :) ... Как видите, все намного проще :) Согласен. Я и не утверждал что это нельзя сделать на С. Просто (лично мне) С++ вариант кажется более изящным, что ли. А оверхеда (о чем, собственно, изначально и шла речь) он не вносит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 13 марта, 2009 Опубликовано 13 марта, 2009 · Жалоба непереносимые расшинения гнуся? Дабы закрыть вопрос про переносимость. Вот такое я нынче в EWAVR пользую: #pragma inline=forced UREG __get_state_and_cli(void) { UREG v=__save_interrupt(); __disable_interrupt(); return v; } #define ATOMIC_BLOCK() for(UREG __iter=0,__state=__get_state_and_cli();!__iter;__restore_interrupt(__state),__iter++) void TestAtomic(void) { ATOMIC_BLOCK() { OSCCAL++; } } Умею. Вы выбрали плохой пример для демонстрации превосходства плюсов в количестве писанины. Что заставляет усомниться в умении :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 13 марта, 2009 Опубликовано 13 марта, 2009 · Жалоба Дабы закрыть вопрос про переносимость. Вот такое я нынче в EWAVR пользую: Кстати, а в ИАРе return внутри for() как себя чувствует? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться