|
|
  |
Вопросы по изучению Си |
|
|
|
Mar 11 2009, 06:05
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(A. Fig Lee @ Mar 11 2009, 02:39)  и де там обсуждается "типичное заблуждение" ? расходы как минимум на конструкторы/деструкторы, виртуальную таблицу, ну и все то, что приносит с собой дженерализейшн. Никаких лишних расходов там нет, то, что делают конструкторы/деструкторы, нужно делать в сишной программе, но там ты можешь забыть, а в С++ компилятор сделает это автоматически. Если виртуальный функций нет, то и виртуальной таблицы не будет. Опять же, если в сишной программе ты будешь делать что-нибудь наподобие перехода по таблице указателей, то это фактически то же самое с теми же расходами.
|
|
|
|
|
Mar 11 2009, 18:12
|
Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233

|
Цитата(A. Fig Lee @ Mar 11 2009, 01:39)  расходы как минимум на конструкторы/деструкторы, виртуальную таблицу, ну и все то, что приносит с собой дженерализейшн. У Страуструпа есть весьма интересная книжка - "Дизайн и эволюция языка С++". Не читали? Рекомендую. Одна из ключевых идей книги - "вы не платите за то, что не используете". Не используете виртуальные функции - не будет никакой таблицы. Не инициализируете члены класса - не будет никаких лишних конструкторов (default ctor, инициализирующий члены default значениями, нормальный компилятор успешно соптимизирует).
|
|
|
|
|
Mar 11 2009, 20:33
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(vik0 @ Mar 11 2009, 21:12)  У Страуструпа есть весьма интересная книжка - "Дизайн и эволюция языка С++". Не читали? Рекомендую. Одна из ключевых идей книги - "вы не платите за то, что не используете". Очень правильная "в принципе" идея, только в реальности С++ слегка провоцирует на дополнительные накладные расходы, предоставляя взамен кучу не всегда нужных фич. А вот людей которые могут не купиться на эти ненужные вещи не так уж и много...
|
|
|
|
|
Mar 11 2009, 21:20
|
Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233

|
Цитата(singlskv @ Mar 11 2009, 22:33)  Очень правильная "в принципе" идея, только в реальности С++ слегка провоцирует на дополнительные накладные расходы, предоставляя взамен кучу не всегда нужных фич. А вот людей которые могут не купиться на эти ненужные вещи не так уж и много... Согласен. Все упирается в поиск баланса - чем вы готовы пожертвовать ради упрощения процесса разработки. Правда это подразумевает неплохое (как минимум) знание языка. С++ - сложный инструмент. А для эффективного использования любого сложного инструмента необходимо его хорошее знание и понимание.
|
|
|
|
|
Mar 12 2009, 01:39
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(haker_fox @ Mar 11 2009, 05:32)  Еще раз повторюсь: даже если небольшой оверхед и есть, это мне не помешало поместить в ATmega16 ОСь + прикладную программу. Все на Си++. Сейчас занимаюсь реалтаймовским приложением. Тоже на Си++, без ОСи (она там просто не нужна). Для ATmega168. Я в свое время также и про Си считал. Только на ассемблере работал. Пока не попробывал. Удобств было... словами не описать. Верю. И в Запорожец можно человек 7 натолкать. Вопрос - еффективно ли ето? Скажите пожалуйста, что вас побудило использовать C++ a не C, и какие его особеености Вы использовали( try/catch, templates, STL, (design patterns maybe), virtual functions, operator overloading, .. etc) Интересно будет послушать. Цитата(vik0 @ Mar 11 2009, 14:12)  У Страуструпа есть весьма интересная книжка - "Дизайн и эволюция языка С++". Не читали? Рекомендую. Одна из ключевых идей книги - "вы не платите за то, что не используете". Не используете виртуальные функции - не будет никакой таблицы. Не инициализируете члены класса - не будет никаких лишних конструкторов (default ctor, инициализирующий члены default значениями, нормальный компилятор успешно соптимизирует). Нет не читал. Не читаю на русском техническую литературу. подозреваю, что ето "The Annotated C++ Reference Manual".. Лежит на работе. Почитываю иногда главки. все вместе нет смысла читать. Надо будет домой забрать, пока не украли. А че там? По сути - если мы все выбросим - ето будет C, только написанный в формате C++. Собственно тут 2 вопроса - почему хорош C++ и почему он плох с мелкими микроконтроллерами.. 1. С появлением C++ стало легче разрабатывать большие проекты - можно все разбить на обьекты, менять их, легко видна структура программы, и т.д. 2. Почему он плох для мелкоконтроллеров: он скрывает связь с ресурсами - например внутри конструктора может быть другой new, что сразу не очевидно. Операторы могут быть переопределены, и так далее.. Не очень прозрачен. Деструкторы - надо помнить что при выходе из скопа вызывается деструктор и т.д. Не, я по жизни и на работе в основном на C++ программирую, но когда дома на мелкоконтроллерах - лучше С
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Mar 12 2009, 15:47
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Цитата(A. Fig Lee @ Mar 12 2009, 09:39)  Верю. И в Запорожец можно человек 7 натолкать. Вопрос - еффективно ли ето? В запорожце сколько сидячих мест? 4? Ну так зачем же туда 7 пихать? В ATmega16 сколько памяти программ? 16Кб? Ну так если мое приложение + ОСь (на Си++) занимают 8 Кб памяти программ и 500 байт ОЗУ (используются буфера, много переменных), то кто мешает мне программировать на Си++? Я же не пытаюсь запихать туда более 16 Кб. Цитата(A. Fig Lee @ Mar 12 2009, 09:39)  Скажите пожалуйста, что вас побудило использовать 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=548053http://electronix.ru/forum/index.php?s=&am...st&p=548100http://electronix.ru/forum/index.php?s=&am...st&p=548240В последнем проекте активно использую наследование. Т.е. когда один класс наследуется другим. Очень удобно. Цитата(A. Fig Lee @ Mar 12 2009, 09:39)  2. Почему он плох для мелкоконтроллеров: он скрывает связь с ресурсами - например внутри конструктора может быть другой new, что сразу не очевидно. Чем это плохо и почему только для МК? На обычном IBM PC оперативы немеренно и бездумное использование new приветствуется, подумаешь пропадет пара сотен МБ? Цитата(A. Fig Lee @ Mar 12 2009, 09:39)  Операторы могут быть переопределены, и так далее.. Опять же, чем это плохо именно для МК? Цитата(A. Fig Lee @ Mar 12 2009, 09:39)  Не очень прозрачен. Ну вот  Цитата(A. Fig Lee @ Mar 12 2009, 09:39)  Деструкторы - надо помнить что при выходе из скопа вызывается деструктор и т.д. Ага, а еще надо помнить, что при создании объекта вызваются конструкторы и при вызове обработчика прерывания нужно сохранять SREG  Конструктор и деструктор можно не определять в классе, тогда ничего вызваться не будет. Деструктор, как правило вообще редко применяется (ИМХО). А вот конструктор - это сплошная выгода. Создаешь объект и не заботишься о вызове функции на подобии Init(), конструктор все сам сделает. Чем плохо? Или вручную, или автоматом. Ну елки-палки, это же неубедительно звучит. Чем это снова плохо именно для МК? Цитата(A. Fig Lee @ Mar 12 2009, 09:39)  Не, я по жизни и на работе в основном на C++ программирую, Для ПК? Цитата(A. Fig Lee @ Mar 12 2009, 09:39)  но когда дома на мелкоконтроллерах - лучше С А почему не АСМ, ведь на нем более оптимально можно написать? Си не очень прозрачен, добавляет свои навороты, оптимизацию, решает за программиста, где и что разместить  АСМ в этом плане гораздо лучше! В общем это юмор. А если серьезно, Вы попробуйте Си++ на МК. Глядишь, и сомнения пропадут, зато получите мощный инструмент на 8 битной платформе. Ну и на последок: конечно, голову никто не отменял. Укладывать все возможности Си++ на AVR никто не собирается, но некоторые возможности почему бы не использовать?
--------------------
Выбор.
|
|
|
|
|
Mar 12 2009, 19:53
|
Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233

|
Цитата(A. Fig Lee @ Mar 12 2009, 03:39)  Нет не читал. Не читаю на русском техническую литературу. подозреваю, что ето "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; } ...и получить на выходе (извините за самоцитирование  ) тот же самый код. Цитата(haker_fox @ Mar 12 2009, 17:47)  Ну и на последок: конечно, голову никто не отменял. Укладывать все возможности Си++ на AVR никто не собирается, но некоторые возможности почему бы не использовать? +100
|
|
|
|
|
Mar 13 2009, 07:05
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(A. Fig Lee @ Mar 12 2009, 04:39)  Деструкторы - надо помнить что при выходе из скопа вызывается деструктор и т.д. Как раз наоборот. Когда ты пишешь на Си, то надо помнить, что всю память, которую ты выделяешь, после использования надо освободить. А в С++ (если, конечно, классы спроектированы правильно) память выделяется в конструкторе, а в деструкторе автматически освобождается. Так же с любой другой инициализацией/освбождением. Главное - правильно споектировать класс чтобы он точно отражал суть описываемого объекта. Так что никакого оверхеда в С++ нет - все что он делает, нужно делать и в Си, но там это должен далеть сам программист вручную и ни о чем не забыть, а в С++ это сделается автоматически.
|
|
|
|
|
Mar 13 2009, 07:16
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата(vik0 @ Mar 12 2009, 21:53)  Ну и отлично! Лично я предпочту написать: Код ... а не: Код ... ...и получить на выходе (извините за самоцитирование  ) тот же самый код. Вы просто не умеете готовить 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 делать в ветках. Но я не сторонник пользовать гнутые фичи.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Mar 13 2009, 07:41
|
Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233

|
Цитата(Rst7 @ Mar 13 2009, 09:16)  Вы просто не умеете готовить plain C: Умею. Но просто мне больше по вкусу С++  Цитата Код ... Как видите, все намного проще  Согласен. Я и не утверждал что это нельзя сделать на С. Просто (лично мне) С++ вариант кажется более изящным, что ли. А оверхеда (о чем, собственно, изначально и шла речь) он не вносит.
|
|
|
|
|
Mar 13 2009, 07:53
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата непереносимые расшинения гнуся? Дабы закрыть вопрос про переносимость. Вот такое я нынче в 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++; } } Цитата(vik0 @ Mar 13 2009, 09:41)  Умею. Вы выбрали плохой пример для демонстрации превосходства плюсов в количестве писанины. Что заставляет усомниться в умении
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|