реклама на сайте
подробности

 
 
7 страниц V  « < 2 3 4 5 6 > »   
Reply to this topicStart new topic
> Вопросы по изучению Си
777777
сообщение Mar 11 2009, 06:05
Сообщение #46


Профессионал
*****

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



Цитата(A. Fig Lee @ Mar 11 2009, 02:39) *
и де там обсуждается "типичное заблуждение" ?
расходы как минимум на конструкторы/деструкторы, виртуальную таблицу, ну и все то, что приносит с собой дженерализейшн.

Никаких лишних расходов там нет, то, что делают конструкторы/деструкторы, нужно делать в сишной программе, но там ты можешь забыть, а в С++ компилятор сделает это автоматически. Если виртуальный функций нет, то и виртуальной таблицы не будет. Опять же, если в сишной программе ты будешь делать что-нибудь наподобие перехода по таблице указателей, то это фактически то же самое с теми же расходами.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Mar 11 2009, 09:32
Сообщение #47


Познающий...
******

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



Цитата(A. Fig Lee @ Mar 11 2009, 07:39) *
и де там обсуждается "типичное заблуждение" ?
расходы как минимум на конструкторы/деструкторы, виртуальную таблицу, ну и все то, что приносит с собой дженерализейшн.

Еще раз повторюсь: даже если небольшой оверхед и есть, это мне не помешало поместить в ATmega16 ОСь + прикладную программу. Все на Си++. Сейчас занимаюсь реалтаймовским приложением. Тоже на Си++, без ОСи (она там просто не нужна). Для ATmega168. Я в свое время также и про Си считал. Только на ассемблере работал. Пока не попробывал. Удобств было... словами не описать.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
vik0
сообщение Mar 11 2009, 18:12
Сообщение #48


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233



Цитата(A. Fig Lee @ Mar 11 2009, 01:39) *
расходы как минимум на конструкторы/деструкторы, виртуальную таблицу, ну и все то, что приносит с собой дженерализейшн.

У Страуструпа есть весьма интересная книжка - "Дизайн и эволюция языка С++". Не читали? Рекомендую. Одна из ключевых идей книги - "вы не платите за то, что не используете".
Не используете виртуальные функции - не будет никакой таблицы. Не инициализируете члены класса - не будет никаких лишних конструкторов (default ctor, инициализирующий члены default значениями, нормальный компилятор успешно соптимизирует).
Go to the top of the page
 
+Quote Post
singlskv
сообщение Mar 11 2009, 20:33
Сообщение #49


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(vik0 @ Mar 11 2009, 21:12) *
У Страуструпа есть весьма интересная книжка - "Дизайн и эволюция языка С++". Не читали? Рекомендую. Одна из ключевых идей книги - "вы не платите за то, что не используете".
Очень правильная "в принципе" идея, только в реальности С++ слегка провоцирует на дополнительные
накладные расходы, предоставляя взамен кучу не всегда нужных фич.
А вот людей которые могут не купиться на эти ненужные вещи не так уж и много...
Go to the top of the page
 
+Quote Post
vik0
сообщение Mar 11 2009, 21:20
Сообщение #50


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233



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

Согласен. Все упирается в поиск баланса - чем вы готовы пожертвовать ради упрощения процесса разработки. Правда это подразумевает неплохое (как минимум) знание языка. С++ - сложный инструмент. А для эффективного использования любого сложного инструмента необходимо его хорошее знание и понимание.
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Mar 12 2009, 01:39
Сообщение #51


Знающий
****

Группа: Участник
Сообщений: 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++ программирую,
но когда дома на мелкоконтроллерах - лучше С


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Mar 12 2009, 15:47
Сообщение #52


Познающий...
******

Группа: Свой
Сообщений: 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=548053
http://electronix.ru/forum/index.php?s=&am...st&p=548100
http://electronix.ru/forum/index.php?s=&am...st&p=548240
В последнем проекте активно использую наследование. Т.е. когда один класс наследуется другим. Очень удобно.
Цитата(A. Fig Lee @ Mar 12 2009, 09:39) *
2. Почему он плох для мелкоконтроллеров:
он скрывает связь с ресурсами - например внутри конструктора может быть другой new,
что сразу не очевидно.

Чем это плохо и почему только для МК? На обычном IBM PC оперативы немеренно и бездумное использование new приветствуется, подумаешь пропадет пара сотен МБ? rolleyes.gif
Цитата(A. Fig Lee @ Mar 12 2009, 09:39) *
Операторы могут быть переопределены, и так далее..

Опять же, чем это плохо именно для МК?
Цитата(A. Fig Lee @ Mar 12 2009, 09:39) *
Не очень прозрачен.

Ну вот crying.gif
Цитата(A. Fig Lee @ Mar 12 2009, 09:39) *
Деструкторы - надо помнить что при выходе из скопа вызывается деструктор и т.д.

Ага, а еще надо помнить, что при создании объекта вызваются конструкторы и при вызове обработчика прерывания нужно сохранять SREG rolleyes.gif Конструктор и деструктор можно не определять в классе, тогда ничего вызваться не будет. Деструктор, как правило вообще редко применяется (ИМХО). А вот конструктор - это сплошная выгода. Создаешь объект и не заботишься о вызове функции на подобии Init(), конструктор все сам сделает. Чем плохо? Или вручную, или автоматом. Ну елки-палки, это же неубедительно звучит. Чем это снова плохо именно для МК?
Цитата(A. Fig Lee @ Mar 12 2009, 09:39) *
Не, я по жизни и на работе в основном на C++ программирую,

Для ПК?
Цитата(A. Fig Lee @ Mar 12 2009, 09:39) *
но когда дома на мелкоконтроллерах - лучше С

А почему не АСМ, ведь на нем более оптимально можно написать? Си не очень прозрачен, добавляет свои навороты, оптимизацию, решает за программиста, где и что разместить biggrin.gif АСМ в этом плане гораздо лучше! В общем это юмор. А если серьезно, Вы попробуйте Си++ на МК. Глядишь, и сомнения пропадут, зато получите мощный инструмент на 8 битной платформе.

Ну и на последок: конечно, голову никто не отменял. Укладывать все возможности Си++ на AVR никто не собирается, но некоторые возможности почему бы не использовать?


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
vik0
сообщение Mar 12 2009, 19:53
Сообщение #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;
}

...и получить на выходе (извините за самоцитирование laughing.gif ) тот же самый код.



Цитата(haker_fox @ Mar 12 2009, 17:47) *
Ну и на последок: конечно, голову никто не отменял. Укладывать все возможности Си++ на AVR никто не собирается, но некоторые возможности почему бы не использовать?

+100
Go to the top of the page
 
+Quote Post
777777
сообщение Mar 13 2009, 07:05
Сообщение #54


Профессионал
*****

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



Цитата(A. Fig Lee @ Mar 12 2009, 04:39) *
Деструкторы - надо помнить что при выходе из скопа вызывается деструктор и т.д.

Как раз наоборот. Когда ты пишешь на Си, то надо помнить, что всю память, которую ты выделяешь, после использования надо освободить. А в С++ (если, конечно, классы спроектированы правильно) память выделяется в конструкторе, а в деструкторе автматически освобождается. Так же с любой другой инициализацией/освбождением. Главное - правильно споектировать класс чтобы он точно отражал суть описываемого объекта.

Так что никакого оверхеда в С++ нет - все что он делает, нужно делать и в Си, но там это должен далеть сам программист вручную и ни о чем не забыть, а в С++ это сделается автоматически.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 13 2009, 07:16
Сообщение #55


Йа моск ;)
******

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



Цитата(vik0 @ Mar 12 2009, 21:53) *
Ну и отлично! Лично я предпочту написать:
Код
...

а не:
Код
...

...и получить на выходе (извините за самоцитирование laughing.gif ) тот же самый код.


Вы просто не умеете готовить 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;
}


Как видите, все намного проще smile.gif

ЗЫ: ATOMIC_BLOCK можно покурить в инклудах гнуся. Кстати, в гнусе можно и прямо return 1 делать в ветках. Но я не сторонник пользовать гнутые фичи.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 13 2009, 07:37
Сообщение #56


Гуру
******

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



Цитата(Rst7 @ Mar 13 2009, 09:16) *
Вы просто не умеете готовить plain C:
plain или непереносимые расшинения гнуся?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 13 2009, 07:40
Сообщение #57


Йа моск ;)
******

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



Цитата
или непереносимые расшинения гнуся?


Где Вы увидели в моем примере непереносимые расширения? wink.gif Я специально обратил внимание, что в гнусе еще проще, но непереносимо.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
vik0
сообщение Mar 13 2009, 07:41
Сообщение #58


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233



Цитата(Rst7 @ Mar 13 2009, 09:16) *
Вы просто не умеете готовить plain C:

Умею. Но просто мне больше по вкусу С++ smile.gif
Цитата
Код
...

Как видите, все намного проще smile.gif

Согласен. Я и не утверждал что это нельзя сделать на С. Просто (лично мне) С++ вариант кажется более изящным, что ли. А оверхеда (о чем, собственно, изначально и шла речь) он не вносит.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 13 2009, 07:53
Сообщение #59


Йа моск ;)
******

Группа: Модераторы
Сообщений: 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) *
Умею.


Вы выбрали плохой пример для демонстрации превосходства плюсов в количестве писанины. Что заставляет усомниться в умении smile.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 13 2009, 08:15
Сообщение #60


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Rst7 @ Mar 13 2009, 11:53) *
Дабы закрыть вопрос про переносимость. Вот такое я нынче в EWAVR пользую:

Кстати, а в ИАРе return внутри for() как себя чувствует?
Go to the top of the page
 
+Quote Post

7 страниц V  « < 2 3 4 5 6 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 20:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01542 секунд с 7
ELECTRONIX ©2004-2016