Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Использование очереди сообщений
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
Harvester
Здравствуйте.

Помогите пожалуйста разобраться с использованием очереди сообщений.
У меня есть процесс (A), периодически передающий пакеты по UART. Второй процесс (cool.gif может в произвольные моменты требовать от
него передачи пакетов, определяемых пользователем. Для этого я собираюсь использовать очередь сообщений.
Но ведь в очередь заносится только указатель на пакет, а как быть с самими данными, особенно если пришло несколько запросов подряд?

Правильно ли я понимаю, что мне необходимо помимо очереди создать что-то вроде кольцевого буфера и обернуть функции POST и PEND для очереди сообщений в свои функции, которые будут брать/класть указатель из/в очереди, извлекать данные из буфера и обслуживать указатели этого буфера?

Спасибо.

PS. Пока писал сообщение, в голову пришла ещё одна мысль - процесс B динамически выделяет память, а процесс A после вычитывания сообщения её освобождает.
Dima_G
Все зависит от того - что подразумеватеся под элементом очереди. Если буфер (+указатель на следующий элемент), то дополнительного пула не нужно))))

Динамически выделять / освобождать память не сильно хорошая идея в embedded системах
Harvester
Цитата(Dima_G @ Nov 27 2009, 11:32) *
Все зависит от того - что подразумеватеся под элементом очереди. Если буфер (+указатель на следующий элемент), то дополнительного пула не нужно))))

Динамически выделять / освобождать память не сильно хорошая идея в embedded системах


В большинстве осей, в той же uC/OS в очереди хранятся именно указатели.

А по второму замечанию - полностью согласен. Потому, наверное, эта идея пришла только в самый последний момент (как самая негодная) smile.gif
Dima_G
Цитата(Harvester @ Nov 27 2009, 12:45) *
В большинстве осей, в той же uC/OS в очереди хранятся именно указатели.


Ну а что мешает сделать свою очередь?

Ни либо на указателях я бы делал так:
хранил отдельно пул буферов

Создал бы очередь - обозвал бы ее FreeQueue
Создал бы очередь в драйвере - назвал TxQueue;

Далее - приложение берет из очереди FreeQueue указатель (считай - буфер), заполняет буфер и помещает указатель на него в TxQueue

Драйвер обнаруживет в TxQueue пакет, обрабатывает его (передает), и помещает в FreeQueue


как-то так smile.gif
Harvester
Цитата(Dima_G @ Nov 27 2009, 11:53) *
Ну а что мешает сделать свою очередь?

Ни либо на указателях я бы делал так:
хранил отдельно пул буферов

Создал бы очередь - обозвал бы ее FreeQueue
Создал бы очередь в драйвере - назвал TxQueue;

Далее - приложение берет из очереди FreeQueue указатель (считай - буфер), заполняет буфер и помещает указатель на него в TxQueue

Драйвер обнаруживет в TxQueue пакет, обрабатывает его (передает), и помещает в FreeQueue


как-то так smile.gif

А ведь так можно вообще обойтись без очереди - использовать пул буферов и счётный семафор!
zltigo
Цитата(Harvester @ Nov 27 2009, 14:38) *
А ведь так можно вообще обойтись без очереди - использовать пул буферов и счётный семафор!

Нафига организовывать очередь руками из дополнительного буфера и семафора, если их поддержка УЖЕ ЕСТЬ в системе.
Если очередь можно пользовать только для указателей, то нужно только добавить к ней один буфер и все.

Цитата(Harvester @ Nov 27 2009, 11:45) *
В большинстве осей, в той же uC/OS в очереди хранятся именно указатели.

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


Цитата(Dima_G @ Nov 27 2009, 11:32) *
Динамически выделять / освобождать память не сильно хорошая идея в embedded системах

Зависит от менеджера памяти, нагрузки и необходимости экономии ресурсов. В большинстве случаев организация буферизации через динамически выделяемые блоки на одно сообщение, действительно, чрезмерно заумна.
Dima_G
Цитата(zltigo @ Nov 27 2009, 15:59) *
Нафига организовывать очередь руками из дополнительного буфера и семафора, если их поддержка УЖЕ ЕСТЬ в системе.
Если очередь можно пользовать только для указателей, то нужно только добавить к ней один буфер и все.


Под буфером, Вы имеете в виду - циклический буфер?

Мне большей частью удобнее НЕ использовать системные очереди. Исключительно из-за их "сишной" природы, как следствие - потери информации о типе вложенного объекта
Harvester
Цитата(zltigo @ Nov 27 2009, 14:59) *
Нафига организовывать очередь руками из дополнительного буфера и семафора, если их поддержка УЖЕ ЕСТЬ в системе.

Вообще-то это не я придумал. Это написал Лабросс в книге по uC/OS, как пример использования счетного семафора.

Цитата(zltigo @ Nov 27 2009, 14:59) *
Если очередь можно пользовать только для указателей, то нужно только добавить к ней один буфер и все.

Действительно, как-то сразу не подумал. Ведь ядро уже контролирует заполненность очереди. И если очередь не полна,
значит, как минимум, одно из самых ранних сообщение уже вычитано и отправитель может писать данные в очередную секцию кольцевого буфера.
Это действительно проще связного списка.

Спасибо!
zltigo
Цитата(Dima_G @ Nov 27 2009, 15:23) *
Под буфером, Вы имеете в виду - циклический буфер?

Совершенно не имеет значения какой - любой, какой оптимален для данного типа данных, нагрузки и прочего. Довольно часто очень просто и удобно реализуются линейные под фрейм расположенные внутри кольцевого. А если фреймы фиксированной длинны, то сам бог велел так делать - 0 недостатков.
Цитата
Мне большей частью удобнее НЕ использовать системные очереди. Исключительно из-за их "сишной" природы, как следствие - потери информации о типе вложенного объекта

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


Цитата(Harvester @ Nov 27 2009, 15:47) *
И если очередь не полна,значит, как минимум, одно из самых ранних сообщение уже вычитано и отправитель может писать данные в очередную секцию кольцевого буфера.

И если полна, то тоже может, ибо должны быть ДВА указателя - на чтение, который проходит через очередь до процесса передачи читающий из буфера передачи и отдельно болтающийся указатель на запись, по которому вне зависимости (ну кроме контроля за фатальным переполнением) от наличия в буфере непереданных фреймов осуществляется запись.
Harvester
Цитата(zltigo @ Nov 27 2009, 16:03) *
И если полна, то тоже может, ибо должны быть ДВА указателя - на чтение, который проходит через очередь до процесса передачи читающий из буфера передачи и отдельно болтающийся указатель на запись, по которому вне зависимости (ну кроме контроля за фатальным переполнением) от наличия в буфере непереданных фреймов осуществляется запись.

Что-то теперь я совсем запутался. 07.gif Как может указатель на запись"отдельно болтаться", если именно его необходимо класть в очередь после заполнения фрейма буфера. И потом, если уж мы используем два указателя, т.е. организуем кольцевой буфер, то какой смысл в очереди? Проще ведь будет использовать счетный семафор, да и по ресурсам выгоднее.
Dima_G
Цитата(zltigo @ Nov 27 2009, 16:03) *
Еруда полная, а не причина, либо тип фиксирован, либо Вы его по любому будете восстанавливать по, например, заголовку.


Реализации универсальных сишных очередей, которые я видел - обычно работают с void указателем на элемент:

Код
push(void* pObj_);
void* pop();


соответственно, никто не застрахован от ошибок

В С++ можно использовать такой подход

Цитата
template <class ELEMENT>\
class TClQueue
{
push(ELEMENT* pclEl_);
ELEMENT* pop();

};



В эту очередь получится запихать либо ELEMENT, либо производные от него
Andron_
Цитата
Динамически выделять / освобождать память не сильно хорошая идея в embedded системах


а можно аргументировать? сам применяю new/delete и пытаюсь понять - будут грабли или нет.
zltigo
Цитата(Harvester @ Nov 27 2009, 16:41) *
Что-то теперь я совсем запутался. 07.gif Как может указатель на запись"отдельно болтаться", если именно его необходимо класть в очередь после заполнения фрейма буфера.

Вопросы кто чем для кого является smile.gif возможен взгляд с разных сторон smile.gif. В очередь кладется указатель чтения - по нему процесс передачи читает из буфера, то, что он будет передавать smile.gif. Указатель записи это принадлежность функции, которая заполняет буфер передачи - по нему будет занесен фрейм и его значение до занесения фрейма будет помещено в очередь.
Цитата
И потом, если уж мы используем два указателя, т.е. организуем кольцевой буфер, то какой смысл в очереди? Проще ведь будет использовать счетный семафор, да и по ресурсам выгоднее.

То, что Вы пытаетесь описать, вообще буфера не требует smile.gif, поскольку Вы упорно предполагаете, что в кольцевом буфере по определению рассчитанном на МНОГО фреймов лежит ОДИН. Для одного нужен ОДИН указатель - нет вопросов. Если Мы действительно используем кольцевой буфер, как буфер, а не лишнюю приблуду, то в нем могут лежать МНОГО фреймов, для них нужно МНОГО указателей. Эти указатели и лежат в очереди до того момента, когда процесс передачи извлечет очередной и начнет по нему вытаскивать из буфера информацию.



Цитата(Dima_G @ Nov 27 2009, 17:57) *
соответственно, никто не застрахован от ошибок

Поверье мне, что ошибок Вы и так наделаете.
Цитата
В С++ можно использовать такой подход

Ненужные выкрутасы на ровном месте для ЧАСТНОГО случая. Ничего, кроме лишнего разнообразия в решении не дает.
Dima_G
Цитата(zltigo @ Nov 27 2009, 18:42) *
Поверье мне, что ошибок Вы и так наделаете.

Ненужные выкрутасы на ровном месте для ЧАСТНОГО случая. Ничего, кроме лишнего разнообразия в решении не дает.


Это я уже обсуждать не буду, а то тема сведется к холивару С vs С++.
Остановимся на том, что почему-то мне так удобнее smile.gif


Цитата(Andron_ @ Nov 27 2009, 19:12) *
а можно аргументировать? сам применяю new/delete и пытаюсь понять - будут грабли или нет.


Можно столкнуться с фрагментацией памяти
Ненормированное время выделения памяти
Нереентерабельность выделения памяти
Ну и мое ИМХО - при статическом распределении ресурсов система более предсказуема smile.gif

вот, почитайте - зедсь есть немного про это
http://www.embedded.com/story/OEG20020222S0026
zltigo
Цитата(Dima_G @ Nov 27 2009, 19:11) *
Это я уже обсуждать не буду, а то тема сведется к холивару С vs С++.
Остановимся на том, что почему-то мне так удобнее smile.gif

C++ тут АБСОЛЮТНО ни причем - на любом языке можете наваять оберток не имеющих никакого смысла и главное годящихся только для частного случая. Изобразить, например, "специальную очередь" для какого-либо фрейма можно по любому, только кроме лишнего исходного текста и лишних сущностей такие выкрутасы не дают ничего.



Цитата(Dima_G @ Nov 27 2009, 19:11) *
Можно столкнуться с фрагментацией памяти

А можно и нет, если принять меры.
Цитата
Ненормированное время выделения памяти

Ну не надо использовать, например, линукс с файлами подкачки и прочим. Хотя именно в том-же линуксе драйвера делают и много много более мрачные системные вызовы smile.gif
Цитата
Нереентерабельность выделения памяти

Ну это если совсем без головы на плечах.
Цитата
Ну и мое ИМХО - при статическом распределении ресурсов система более предсказуема smile.gif

Эх, конечно. Только вот если с ресурсами напряг и всем нарезать их про запас не хватает?
dxp
Цитата(zltigo @ Nov 27 2009, 22:49) *
C++ тут АБСОЛЮТНО ни причем - на любом языке можете наваять оберток не имеющих никакого смысла и главное годящихся только для частного случая. Изобразить, например, "специальную очередь" для какого-либо фрейма можно по любому, только кроме лишнего исходного текста и лишних сущностей такие выкрутасы не дают ничего.

Вы хотите сказать, что очередь на основе void* ничем не хуже очереди на основе TypeName*? С точки зрения удобства и безопасности использования.
zltigo
Цитата(dxp @ Nov 28 2009, 12:30) *
Вы хотите сказать, что очередь на основе void* ничем не хуже очереди на основе TypeName*? С точки зрения удобства и безопасности использования.


Я хочу сказать, что TypeName* ничем не лучше и делать нечто самодельное похожее на очередь ВМЕСТО механизма очередей системы, по причине того, что очередь с void* есть глупость.

Причем эта поделка не годится, если мы в очередь кладем разные сообщения. Да и если только один тип, то пользы от нее как от козла молока, ибо извлечение из очереди в большинстве случаев в одном месте и ошибиться с приведением (TypeName *) это надо сильно постараться, как и запихнуть в одном-нескольких местах программы очередь нечто другое. Эти экзерсисы что-то вроде подстелить несколько пучков соломки на землю для страховки при возможном падении с 5 этажа - хуже не будет, но и реальной пользы от лишних телодвижений никакой. Родить какую-нибудь конструкцию, например
Цитата
#define put_typename( x ) { TypeName *tmp = x; put( tmp ); }

для "защиты" и создания лишней "своей" очереди я могу и на 'C', только находясь в здравом уме делать такого не буду, а уж тем более изготавливать костыли с TypeName* ВМЕСТО штатной очереди.
Dima_G
Цитата(zltigo @ Nov 28 2009, 13:07) *
Причем эта поделка не годится, если мы в очередь кладем разные сообщения. Да и если только один тип, то пользы от нее как от козла молока, ибо извлечение из очереди в большинстве случаев в одном месте и ошибиться с приведением (TypeName *) это надо сильно постараться, как и запихнуть в одном-нескольких местах программы очередь нечто другое. Эти экзерсисы что-то вроде подстелить несколько пучков соломки на землю для страховки при возможном падении с 5 этажа - хуже не будет, но и реальной пользы от лишних телодвижений никакой. Родить какую-нибудь конструкцию, например

для "защиты" и создания лишней "своей" очереди я могу и на 'C', только находясь в здравом уме делать такого не буду, а уж тем более изготавливать костыли с TypeName* ВМЕСТО штатной очереди.



Ничего личного, но сразу видно отличие Сишного стиля мышления от Сиплюсового. wink.gif
В шаблонную очередь (пример выше) мы можем класть не только объектры ELEMENT, но и наследников от него. Это про "разные сообщения"
Далее - насчет "запихнуть не то - невозвожно". Да леко!
Я кончено понимаю, что специалист Вашего уровня никогда не ошибается, но у меня могут быть промашки - при 10 очередях и 20 типах объектов, которые "гуляют" по ним. И любые средства языка, которые хоть немного могут это предотвратить, я очень приветствую.
zltigo
Цитата(Dima_G @ Nov 28 2009, 20:40) *
Это про "разные сообщения"

А, блин, при выемке распознавать святым духом.... Зачем мелкие дежурные "мероприятия".
Цитата
Ничего личного, но сразу видно отличие Сишного стиля мышления от Сиплюсового.

Разница много больше проявляется в отсутствии/наличии мышления.
Ink
Цитата
В шаблонную очередь (пример выше) мы можем класть не только объектры ELEMENT, но и наследников от него. Это про "разные сообщения"

боюсь, что в шаблонную очередь вы положите указатель на объект, а не элемент. если элемент, то вы его потом не распознаете (плюс у разных объектов разный размер). а в случае указателя, ну да, компилятор сделает за вас работу по идентификации объекта (а точнее, будет работать динамический полиморфизм с виртуальными функциями).

если всю программу принципиально писать в стиле си++, то ваш подход корректен. если же плюсы избыточны для данной задачи, то и не надо парить моск с обертками. тем более что если вы точно знаете, что в очереди указатель на ELEMENT или производный от него, то при передаче приведите его к void*, а при получении к ELEMENT*. и никаких проблем. никакого лишнего кода.
Сергей Борщ
Цитата(Ink @ Nov 29 2009, 04:14) *
если вы точно знаете, что в очереди указатель на ELEMENT или производный от него, то при передаче приведите его к void*, а при получении к ELEMENT*.
Гм... Зачем тут void *? Почему бы не приводить к ELEMENT * сразу при передаче? И зачем тут вообще приведение? Если исходный имеет тип ELEMENT * или производный от него, приведение будет выполнено неявно. Если тип совсем другой - то какой смысл его класть в эту очередь, ведь при извлечении получим ELEMENT*, как мы узнаем, что тип был совсем другой?
dxp
Цитата(zltigo @ Nov 28 2009, 16:07) *
Я хочу сказать, что TypeName* ничем не лучше

Лучше принципиально. Наличием четкого статического контроля типов.

Цитата(zltigo @ Nov 28 2009, 16:07) *
и делать нечто самодельное похожее на очередь ВМЕСТО механизма очередей системы, по причине того, что очередь с void* есть глупость.

Если системная очередь ограничена в виду используемого "системного" яыка С типом void*, то при наличие возможностей ++ имеет смысл не полениться написать обертку для работы с нормальными средствами языка, а не использовать затычку void*.

Цитата(zltigo @ Nov 28 2009, 16:07) *
Причем эта поделка не годится, если мы в очередь кладем разные сообщения.

Сообщения - как типы одной иерархии. В очередь - указатель на базовый тип. Извлечение - вызов виртуальной функции. Все просто, прозрачно, наглядно, безопасно.

Цитата(zltigo @ Nov 28 2009, 16:07) *
Да и если только один тип, то пользы от нее как от козла молока, ибо извлечение из очереди в большинстве случаев в одном месте и ошибиться с приведением (TypeName *) это надо сильно постараться, как и запихнуть в одном-нескольких местах программы очередь нечто другое. Эти экзерсисы что-то вроде подстелить несколько пучков соломки на землю для страховки при возможном падении с 5 этажа - хуже не будет, но и реальной пользы от лишних телодвижений никакой.

Ну, не все же такие "укротители кода", большинству людей свойствено ошибаться. И код пишется часто не только для себя. И цель - так спроектировать программу, чтобы в ней в идеале не было ни одного ручного преобразования типов (что, к сожалению, не всегда удается, но реально оправданные случаи - это, как правило, стыковка с "железом" - например, преобазование целого в адрес (указатель)). И не зря не последние люди в Computer Science говорят, что ручное преобразование типа чаще всего указывает на ошибку проектирования.

Цитата(zltigo @ Nov 28 2009, 16:07) *
для "защиты" и создания лишней "своей" очереди я могу и на 'C', только находясь в здравом уме делать такого не буду, а уж тем более изготавливать костыли с TypeName* ВМЕСТО штатной очереди.

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

P.S. Знаю вас как сложившегося, квалифицированного специалиста, ни разу не сомневаюсь, что все вышеприведенное вас ни в чем не убедило. Т.ч. это скорее не к вам пост, а просто как флаг того, что есть и другое мнение по этому вопросу. Для сомневающихся, так сказать. smile.gif
Ink
Цитата(Сергей Борщ @ Nov 29 2009, 13:52) *
Гм... Зачем тут void *? Почему бы не приводить к ELEMENT * сразу при передаче? И зачем тут вообще приведение?

если функция отправки в очередь принимает только void*, то при ее вызове надо все приводить к void* smile.gif это избавит от варнингов в различных компиляторах.
Цитата
имеет смысл не полениться написать обертку для работы с нормальными средствами языка, а не использовать затычку void*.

с т.з. языка - да. а с т.з. получившегося кода? гробим и память, и быстродействие.
Сергей Борщ
Цитата(Ink @ Nov 29 2009, 19:33) *
если функция отправки в очередь принимает только void*, то при ее вызове надо все приводить к void* smile.gif это избавит от варнингов в различных компиляторах.
Тут вы глубоко ошибаетесь. К void* любой не-cv (не const и не volaile) указатель приводится неявно, о чем ясно написано в стандарте. Если компилятор на это выдает предупреждение - надо писать его разработчикам используя примерно такие идиомы: cranky.gif maniac.gif Вы ведь не приводите к void * при вызове memcpy(), memset()?


Цитата(Ink @ Nov 29 2009, 19:33) *
с т.з. языка - да. а с т.з. получившегося кода? гробим и память, и быстродействие.
грамотно написанная обертка работает на этапе компиляции. Не отнимая ни байта, ни такта на этапе выполнения.
Harvester
Цитата(zltigo @ Nov 27 2009, 18:42) *
Вопросы кто чем для кого является smile.gif возможен взгляд с разных сторон smile.gif. В очередь кладется указатель чтения - по нему процесс передачи читает из буфера, то, что он будет передавать smile.gif. Указатель записи это принадлежность функции, которая заполняет буфер передачи - по нему будет занесен фрейм и его значение до занесения фрейма будет помещено в очередь.

То, что Вы пытаетесь описать, вообще буфера не требует smile.gif, поскольку Вы упорно предполагаете, что в кольцевом буфере по определению рассчитанном на МНОГО фреймов лежит ОДИН. Для одного нужен ОДИН указатель - нет вопросов. Если Мы действительно используем кольцевой буфер, как буфер, а не лишнюю приблуду, то в нем могут лежать МНОГО фреймов, для них нужно МНОГО указателей. Эти указатели и лежат в очереди до того момента, когда процесс передачи извлечет очередной и начнет по нему вытаскивать из буфера информацию.


Видимо, я не совсем понятно выразился unsure.gif. Говоря об ОДНОМ указателе я имел в виду именно указатель, который процесс команд помещает в очередь и который является "независимым" от очереди. Естественно, процесс передачи будет работать с другим указателем, который он возьмет из очереди.
Ink
Цитата(Сергей Борщ @ Nov 30 2009, 04:18) *
Тут вы глубоко ошибаетесь.

да нет же, я просто немного попутал laughing.gif

Цитата(Сергей Борщ @ Nov 30 2009, 04:18) *
грамотно написанная обертка работает на этапе компиляции. Не отнимая ни байта, ни такта на этапе выполнения.

согласен, но когда сиплюсплюсники ведут речь о виртуальных функциях - это уже другой случай, на этапе компиляции не получится.
dxp
Цитата(Ink @ Dec 2 2009, 16:32) *
согласен, но когда сиплюсплюсники ведут речь о виртуальных функциях - это уже другой случай, на этапе компиляции не получится.

Так виртуальные функции дают качественно новый функционал. Если его реализовать средствами С, то получится то же самое по ресурсам и гора вспомогательного кода, загромождающего основной. Если функциональность, даваемая виртуальными функциями, не нужна, то и не надо их использовать.
zltigo
Цитата(dxp @ Nov 29 2009, 18:55) *
Нет ни одной причины не использовать. И уж если некогда/не хочется/лень/т.п. в плане использования - это личное дело, но и обосновывать эту позицию тоже ни к чему - за этим ничего, кроме личного субъективизма нет.

Вы похоже потеряли то, с чего собственно начались мои возражения sad.gif. Напомню.
Было предложено при имеющейся системе "сделать свою очередь" . На мое возражение, что в таком случае городить самодельные очереди не надо, было отвечено "Мне большей частью удобнее НЕ использовать системные очереди. Исключительно из-за их "сишной" природы". И так далее..... до
"сразу видно отличие Сишного стиля мышления от Сиплюсового" smile.gif
Dima_G
Цитата(zltigo @ Dec 3 2009, 11:09) *
Вы похоже потеряли то, с чего собственно начались мои возражения sad.gif. Напомню.
Было предложено при имеющейся системе "сделать свою очередь" . На мое возражение, что в таком случае городить самодельные очереди не надо, было отвечено "Мне большей частью удобнее НЕ использовать системные очереди. Исключительно из-за их "сишной" природы". И так далее..... до

Никто нить не терял smile.gif. Здесь я своего мнения не изменю - если в качестве языка выбран С++, нужно использовать его возможности. Например - типизацию элемента очереди. Зачем мне системные очереди, которые все приводят к void* ?

Цитата(zltigo @ Dec 3 2009, 11:09) *
"сразу видно отличие Сишного стиля мышления от Сиплюсового" smile.gif


Если это Вас задело - извиняюсь. Я вкладывал в эту фразу следующий смысл
"Сишник работает с данными, как с куском памяти. Плюсовик - как с объектом"
zltigo
Цитата(dxp @ Nov 29 2009, 18:55) *
все вышеприведенное вас ни в чем не убедило. Т.ч. это скорее не к вам пост, а просто как флаг того, что есть и другое мнение по этому вопросу. Для сомневающихся, так сказать. smile.gif

А должно было smile.gif? Самые главные плюсы плюсов, и это неизбежно, связаны с накладными расходами (и благодаря системному подходу эти расходы чаще всего МЕНЬШЕ, нежели неумелые реализации подобного на 'C' ), но именно в этом сила. Использование С++ только из-за того,что-бы местами в частных случаях избавится от какого-нибудь void * притянуто за уши sad.gif.
Цитата
Ну, не все же такие "укротители кода", большинству людей свойствено ошибаться.

Мне тоже - много и жестоко, только я точно могу сказать, что в 99% моих ошибок выявляющихся в процессе компиляции и легкой отладки и 99,999% ошибок выявляющихся в процессе эксплуатации используемый язык написания совсем не виноват sad.gif.
P.S.
В 90x мне пришлось столкнуться с ADA - был один телекоммуникационный проект на западников. Вот уж язык,который старались создавать,как безошибочный, но доведенный до абсурда в том числе и с заветной целью военных взять военных специалистов и они все безошибочно напишут все, что и как нужно военным. Так вот, человек,который руководил поминаемым мной проектом, будучи и оставаясь ярым ADA-вцем буквально сбежал разорвав контракт с большими для себя потерями, когда в его предыдущий военный проект начали прикомандировывать военных специалистов прошедших курс обучения языку ADA. Им, и это совершенно естественно, легко удавалось делать умопомрачительное количество ошибок.
Цитата(Dima_G @ Dec 3 2009, 11:26) *
Если это Вас задело - извиняюсь. Я вкладывал в эту фразу следующий смысл
"Сишник работает с данными, как с куском памяти. Плюсовик - как с объектом"

Вы НИЧЕГО не знаете о программировании. Совсем sad.gif Не путайте дурное "программирование", с Программированием.
dxp
Цитата(zltigo @ Dec 3 2009, 14:58) *
Самые главные плюсы плюсов, и это неизбежно, связаны с накладными расходами

Главные плюсы плюсов основаны на использовании классов, как типов, определяемых пользователем. Это дает модель программы как прототипа реального мира. Где тут накладные расходы?

Цитата(zltigo @ Dec 3 2009, 14:58) *
Использование С++ только из-за того,что-бы местами в частных случаях избавится от какого-нибудь void * притянуто за уши sad.gif.

Не "избавиться от какого-нибудь void*", а привести программу к виду, в котором нет потенциально опасного кода из-за отсутствия контроля типов. И если это можно сделать без накладных расходов, добавив читабельности и безопасности использования, то это вполне достойная цель.
Dima_G
Цитата(dxp @ Dec 4 2009, 12:18) *
Не "избавиться от какого-нибудь void*", а привести программу к виду, в котором нет потенциально опасного кода из-за отсутствия контроля типов. И если это можно сделать без накладных расходов, добавив читабельности и безопасности использования, то это вполне достойная цель.

Согласен полностью. Даже более - можно и нужно идти на накладные расходы, которые позволят улучшить читаемость, надежность и сопровождаемость программы. И выбирать платформу, с учетом этих расходов.
По крайней мере, это выгодно в моей области - так как цена "железа" составляет менее 10 процентов от продажной стоимости.
А на первом месте стоит именно - надежность и сроки разработки.
zltigo
Цитата(dxp @ Dec 4 2009, 12:18) *
добавив читабельности и безопасности использования, то это вполне достойная цель.

Цель нормальная, только, как я уже писал, от львиной доли ошибок сие не избавит. Как и использования классов не избавляет от их использования через анальное отверстие sad.gif. И вынужден уже третий раз просить обратить внимание на то, с чего начались мои возражения и прямо ответить на вопрос (можете самому себе smile.gif ) - писать самодельную очередь на C++ или использовать готовую системную пусть и с void* ? Как тут дела обстоят в этом конкретном случае и послужившим началом всего этого флейма с "улучшить читаемость, надежность и сопровождаемость программы"?
dxp
Цитата(zltigo @ Dec 4 2009, 16:06) *
И вынужден уже третий раз просить обратить внимание на то, с чего начались мои возражения и прямо ответить на вопрос (можете самому себе smile.gif ) - писать самодельную очередь на C++ или использовать готовую системную пусть и с void* ? Как тут дела обстоят в этом конкретном случае и послужившим началом всего этого флейма с "улучшить читаемость, надежность и сопровождаемость программы"?

Не вижу проблем инкапсулировать код системной void* очереди в класс/шаблон. Даже накладных каких-то не предвижу. И пользоваться этой безопасной и удобной оберткой. И писанины тоже много не должно быть - не так много функционала у очереди - push/pop, read/write, flush + еще может быть несколько сервисных функций.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.