Перейти к содержанию
    

Вопросы по изучению Си

и де там обсуждается "типичное заблуждение" ?

расходы как минимум на конструкторы/деструкторы, виртуальную таблицу, ну и все то, что приносит с собой дженерализейшн.

Никаких лишних расходов там нет, то, что делают конструкторы/деструкторы, нужно делать в сишной программе, но там ты можешь забыть, а в С++ компилятор сделает это автоматически. Если виртуальный функций нет, то и виртуальной таблицы не будет. Опять же, если в сишной программе ты будешь делать что-нибудь наподобие перехода по таблице указателей, то это фактически то же самое с теми же расходами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и де там обсуждается "типичное заблуждение" ?

расходы как минимум на конструкторы/деструкторы, виртуальную таблицу, ну и все то, что приносит с собой дженерализейшн.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

расходы как минимум на конструкторы/деструкторы, виртуальную таблицу, ну и все то, что приносит с собой дженерализейшн.

У Страуструпа есть весьма интересная книжка - "Дизайн и эволюция языка С++". Не читали? Рекомендую. Одна из ключевых идей книги - "вы не платите за то, что не используете".

Не используете виртуальные функции - не будет никакой таблицы. Не инициализируете члены класса - не будет никаких лишних конструкторов (default ctor, инициализирующий члены default значениями, нормальный компилятор успешно соптимизирует).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Страуструпа есть весьма интересная книжка - "Дизайн и эволюция языка С++". Не читали? Рекомендую. Одна из ключевых идей книги - "вы не платите за то, что не используете".
Очень правильная "в принципе" идея, только в реальности С++ слегка провоцирует на дополнительные

накладные расходы, предоставляя взамен кучу не всегда нужных фич.

А вот людей которые могут не купиться на эти ненужные вещи не так уж и много...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Очень правильная "в принципе" идея, только в реальности С++ слегка провоцирует на дополнительные

накладные расходы, предоставляя взамен кучу не всегда нужных фич.

А вот людей которые могут не купиться на эти ненужные вещи не так уж и много...

Согласен. Все упирается в поиск баланса - чем вы готовы пожертвовать ради упрощения процесса разработки. Правда это подразумевает неплохое (как минимум) знание языка. С++ - сложный инструмент. А для эффективного использования любого сложного инструмента необходимо его хорошее знание и понимание.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще раз повторюсь: даже если небольшой оверхед и есть, это мне не помешало поместить в 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++ программирую,

но когда дома на мелкоконтроллерах - лучше С

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Верю. И в Запорожец можно человек 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++ программирую,

Для ПК?

но когда дома на мелкоконтроллерах - лучше С

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет не читал. Не читаю на русском техническую литературу. подозреваю, что ето "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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Деструкторы - надо помнить что при выходе из скопа вызывается деструктор и т.д.

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

 

Так что никакого оверхеда в С++ нет - все что он делает, нужно делать и в Си, но там это должен далеть сам программист вручную и ни о чем не забыть, а в С++ это сделается автоматически.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну и отлично! Лично я предпочту написать:

...

а не:

...

...и получить на выходе (извините за самоцитирование :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 делать в ветках. Но я не сторонник пользовать гнутые фичи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы просто не умеете готовить plain C:
plain или непереносимые расшинения гнуся?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы просто не умеете готовить plain C:

Умею. Но просто мне больше по вкусу С++ :)

...

Как видите, все намного проще :)

Согласен. Я и не утверждал что это нельзя сделать на С. Просто (лично мне) С++ вариант кажется более изящным, что ли. А оверхеда (о чем, собственно, изначально и шла речь) он не вносит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Дабы закрыть вопрос про переносимость. Вот такое я нынче в 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++;
  }
}

 

Умею.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дабы закрыть вопрос про переносимость. Вот такое я нынче в EWAVR пользую:

Кстати, а в ИАРе return внутри for() как себя чувствует?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...