Re[2]: Достаточно ли знать С без знания С++ для устройства на работу?
От: smeeld  
Дата: 06.09.14 12:12
Оценка:
Здравствуйте, мыщъх, Вы писали:

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


В РФ просто подавляющее большинство программистов, есть не что иное как прораммистский планктон,
который не умеет ничего серьёзного кроме как обслуживать что разработали на западе, и понты резать.
Для последнего С++ подходит идеально. Когда в США и прочих европах пишут большое множество ОС, БД,
(посмотрите в код mysql-там, не что иное как С с классами и не более), компиляторов (посмотрите в код gcc,
LLVM-там, не что ино как С с классами и не более), в РФ смеются всем отделом над теми, кто вместо BOOST_FOREACH пишет for...
и думают, что Торавльдс тупее их, и не смог изучить С++ ( бред-то какой )

Кстати, мыщъх, а что там с Lisp-ом? Встречается где или нет?
Re[10]: Достаточно ли знать С без знания С++ для устройства
От: eskimo82  
Дата: 06.09.14 12:13
Оценка: :)
CC>>>Мне надо автоматический вызов конструкторов и деструкторов. Без макроёбства.
E>>Зачем тебе конструкторы, если ничего полезного в них ты сделать не сможеш по причиние невозможности вернуть ошибку ?
CC>Это почему ещё?
CC>Исключения работают, RTTI кстати тоже можно прикрутить, впрочем он очень редко нужен.
Как я понял из соседнего разговора — ты все смешал в кучу и не понимаеш, что SEH и плюсовые исключения — это совершенно разные вещи, хотя, конкретно в виндах у микрософтовского компилятора С++ исключения реализуются на базе SEH. Причем, чтобы это работало, внутри ядра должн быть закреплен фильтр SEH из userspace runtime который знает про формат сгенерированных твой любимой студией стековых фреймов. А надо сказать, этот формат для разных студий отличается. Ты хоть понимаеш каким диким говнокодом тебе придется осуществлять поддержку ++ ?

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

CC>>>Overloading нужна по параметрам: http://www.cplusplus.com/doc/tutorial/functions2/

E>>Ты можеш реализовать это с использованием gcc шного typeof и свитча внутри function-like макроса.
CC>Спасибо, макросы кушайте сами.
Ты даже не понял о чем я говорю.

CC>>>Вы когда нибудь отлаживали макросы? В вложенные макросы? Я — отлаживал, больше не хочу.

E>>Отлаживал и в огромных кол-вах. Надо просто уметь писать обобщенный код в макросах так, чтобы его было удобно отлаживать.
E>>Для этого надо писать не "в лоб", а немного подумать.
CC>Я в тот проект пришёл когда там линуксоиды со стажем все свои макросы уже написали. И занимались увлекательным делом — пытались с этим всем взлететь.
И, пока ты там не появился, весь в белом и на коне, ничего взлететь не могло. Ага, унылый сказочник.

E>>Думать можно начать с Степановского сишного прототипа STL.

CC>Ссылка была бы просто замечательна.
Спроси у гугла, ну или зайди на страницу Степанова — там есть ссылка.

CC>>>Вот только не надо мне рассказывать про макросы. Я их давным давно наелся.

E>>Ты просто не умееш с ними работать.
CC>
CC>Можно я буду так отвечать всем, кто кричит что С++ плохой?
А кто-то кричит что С++ плохой ? С++ — хороший, но внутри своей ниши, и не стоит пытаться тащить его во все без исключения места.

E>>>>2. Автоматический контроль за временем жизни переменных, RAII

E>>>>- Поскольку исключений нет, то и вернуть ошибку из конструктора невозможно.
CC>>>Исключения есть, лично писал kernel код с их использованием.
E>>Вот тут было интересно узнать подробности.
CC>Речь естественно про винду, в которой озаботились чтобы люди могли просто ловить исключения в ядре. Причём ловятся все, включая access violation.
Ты опять мешаеш всё в кучу, толи по глупости, толи из-за не понимания. Аксес виолайшен — это SEH исключение, оно из более низкого уровня абстракции. В языке С++ нет никаких access violation.

CC>Throw, сгенеренный компилятором, вызывает _CxxThrowException, которая всегда бросает стандартный виндовый SEH. Ядрёная реализация это делает через RtlRaiseException.

CC>Ловим __try / __except c EXCEPTION_EXECUTE_HANDLER. Бросаться стандартными классами исключений становится несколько сложнее.
CC>Из-за этой разницы стандартные юзермодные библиотеки без обработки напильником в кернеле использовать не получается.
Я знаком с этой кухней, поскольку лет 7-8 назад назад изучал возможность замены стандартного рантайма от студии на собственный.
_CxxThrowException — это функция из рантайма С++ предназначена для выполнения в user space mode.
RtlRaiseException — это опять же функция рантайма (но уже системного) и она предназначена для выполнения в user space mode.
При этом у С++ исключений есть специальный идентификатор, по которому его внутри фильтра можно отличить и разобрать фрейм сгенерированой студией. Но — формат этого фрейма а) немного разный для разных версий студии, б) недокументирован. А в твоем фильтре обработчике тебе надо разобрать этот формат, сделать unmangling типа RTTI и вызвать соответсвующие деструкторы.

CC>Можно прикрутить RTTI, можно сделать свои классы с блекджеком и всем что к нему прилагается.

Тебе это придется делать в любом случае — что бы понять что за исключение ты поймал и надо ли продолжать раскрутку стека.

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


E>>Особбенно совмещение неопределенных точек возврата с сишным кодом ядра.

CC>Не понял про что ты?
У сишного кода есть четко обозначеные точки возврата "наверх". Использование исключений дает неопределенныые точки возврата — раскрутка стека может произойти в любом месте. Сишный код такого эээ несколько не ожидает.

E>>Еще раз — ты просто не научился нормально работать с макросами.

CC>Судя по тому, как линуксоиды со стажем мудохаются со своими же макросами — с ними никто не умеет работать.
CC>Так что я не вижу смысла инвестировать свое время в напрасный труд.
Для начала тебе надо самому понять почему так, как ты описал выше, делать нельзя. К сожалению, ты неквалифицирован.

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

CC>>>Весь "системный геморрой" заключается в написании С++ stdlib для кернела с поддержкой SEH/Signal исключений. Очень сложно, да!
E>>То что ты сказал — на мой взгляд, сделать в линуксе невозможно. Но ты можеш поделить ссылкой на пример, если таковой конечно существует.
CC>Почему в винде это возможно (по факту) а в линухе вдруг нет?
Потому что в винде — это хак, в основе которого лежит использование того факта, что один единственый компилятор поддерживает механизм С++ исключений на основе системного механизма SEH.

E>>Даже для юзер спэйса, где нет кучи ограничений, написание поддержки С++ является проблемой. Через сколько там лет после первого релиза в андроиде появилася порт libstdc++ — можеш напомнить ?

CC>Спроси у авторов андроида почему у них руки из задницы.
Это у тебя руки из задницы.

E>>>>Вам такой С++ вообще нужен ?

CC>>>Мало того что нужен, мы его в винде давно уже используем.
E>>Не потому ли виндой сейчас уже невозможно пользоваться?
CC>Кому?
Нормальным разработчикам.

CC>>>Только линуксоиды упираются и цепляются за духовные скрепы С.

E>>Винда потихоньку помрет и туда ей дорога.
CC>Дада, она уже чёрти сколько лет вот вот помрёт. Осталось подождать ещё совсем немного.
А помрет она из-за таких вот горе-программистов.
Отредактировано 06.09.2014 12:23 eskimo82 . Предыдущая версия . Еще …
Отредактировано 06.09.2014 12:17 eskimo82 . Предыдущая версия .
Re[30]: Достаточно ли знать С без знания С++ для устройства
От: eskimo82  
Дата: 06.09.14 12:14
Оценка: -1 :)
E>>>>>>С чего ты взял что constexpr обязательно выполнится на этапе компиляции, а не после ушлого компилятора на этапе инициализации программы ?
CC>>>>>Потому что стандарт.
E>>>>И що ? Стандарт — стандартом, компиляторы его особо не придерживаются, особенно MS.
CC>>>Ну конечно же! Операция + может на самом деле делить, ведь "Стандарт — стандартом, компиляторы его особо не придерживаются".
E>>В С++ — вполне может.
CC>Полностью в соответствии со стандартом между прочим.
CC>Так что ты определись, придерживаются они стандарта или нет.
Компиляторостроители ? — Нет не придерживаются, об этом есть многочисленые факты.
Отредактировано 06.09.2014 12:15 eskimo82 . Предыдущая версия .
Re[12]: Достаточно ли знать С без знания С++ для устройства на работу?
От: -n1l-  
Дата: 06.09.14 12:26
Оценка:
Здравствуйте, CreatorCray, Вы писали:

N>> И вообще, разве невнимательность программиста — это проблема языка?

CC>Если бы люди были всегда внимательными то и память никогда бы не текла, ни по NULL поинтеру никто бы не ходил, все ошибочные ситуации правильно обрабатывались и проч. и проч.

Ну ошибки при компиляции не будет. Но это опять же не в языке дело.
Re[26]: Достаточно ли знать С без знания С++ для устройства
От: eskimo82  
Дата: 06.09.14 12:32
Оценка:
S>Вы про crypto_tfm?
Нет.
Re[25]: Достаточно ли знать С без знания С++ для устройства
От: Хон Гиль Дон Россия  
Дата: 06.09.14 12:34
Оценка:
Здравствуйте, eskimo82, Вы писали:

ХГД>>И на выяснение этого факта надо много часов с отладчиком и дизассемблером?

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

Обиделся и начал хамить, сомневаться в квалификации и обсуждать личность собеседников? Ай-ай-ай, стыд и позор.

ХГД>>Ужас-ужас, а дустом не пробовали? В смысле, constexpr constructor тоже почему-то не годиццо?

E>С чего ты взял что constexpr обязательно выполнится на этапе компиляции, а не после ушлого компилятора на этапе инициализации программы ?

А с чего ты взял, что составными литералами твои структурки проинициализирутся не после ушлого компилятора на этапе инициализации программы ?
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[26]: Достаточно ли знать С без знания С++ для устройства
От: eskimo82  
Дата: 06.09.14 12:47
Оценка:
ХГД>>>И на выяснение этого факта надо много часов с отладчиком и дизассемблером?
E>>В том случае, про который я рассказываю, компилятор сгенерировал инициализирующий конструктор для таблицы замен знаменитого госта (что такое таблица замен и гост я расказывать не буду — ты все равно не поймеш), сгенерировал он его потому что мудрила, набивший эти таблицы сделал это с нарушением сишного синтаксиса, а сам код — это был как раз тот случай когда модуль к ядру был написан на С++ и собирался как С++ код. Как ты догадываешся, все внешние юнит-тесты прекрасно проходили. Но связь с другой стороной пропала — пакеты вроде ходят, но расшифроваться не могут.
E>>А теперь, умник, обозначь свои действия в этой ситуации.

ХГД>Обиделся и начал хамить, сомневаться в квалификации и обсуждать личность собеседников? Ай-ай-ай, стыд и позор.

Будь добр, ответь на поставленый вопрос. Об остальном мы поговорим позже.
Re[27]: Достаточно ли знать С без знания С++ для устройства
От: Хон Гиль Дон Россия  
Дата: 06.09.14 13:50
Оценка:
Здравствуйте, eskimo82, Вы писали:

ХГД>>>>И на выяснение этого факта надо много часов с отладчиком и дизассемблером?

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

ХГД>>Обиделся и начал хамить, сомневаться в квалификации и обсуждать личность собеседников? Ай-ай-ай, стыд и позор.

E>Будь добр, ответь на поставленый вопрос.

Код в студию сначала. Равно как и версии всего софта, что использовался. Не охота гадать по каким-то мутным сказкам.

E>Об остальном мы поговорим позже.


Да о чем с тобой, хамлом, разговаривать
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[12]: Достаточно ли знать С без знания С++ для устройства н
От: Andrew.W Worobow https://github.com/Worobow
Дата: 06.09.14 14:26
Оценка:
Здравствуйте, CreatorCray, Вы писали:

AWW>>Ну вот и чтобы все же что его писать (безопасный код) на СИ, требуется большая квалификация. ))

CC>Это всё в теории. В реальной жизни получается чем сложнее инструмент тем выше нужна квалификация чтобы этим инструментом сделать то, что надо, не навредив самому себе.
CC>С++ мощный язык, но и в то же время опасный в неопытных руках. Он может всё, что может С + ещё много чего сверху.




AWW>>>>То есть СИ более низкоуровневый язык, а чем ниже уровень, тем ближе к "железу", тем выше нужна квалификация.

CC>>>Чем сложнее инструмент тем выше нужна квалификация.
AWW>>Ну а почему инструмент сложен? Самый простой это ассемблер — всего-то команды и адреса. Но писать на нем сложно.
CC>Писать на нём не сложно, писать на нём громоздко. Повышается вероятность тупой ошибки в стиле "просмотрел" или "забыл".

Ну дык елы палы )) — вероятность ошибки и есть то что требует высокой квалиф. что ее не делать. ИМХА, это банальность и по-моему ты пытаешся сказать то что не получается. )) То-есть не надо искать черную кошку в черной комнате...

CC>С от ассемблера недалеко ушёл, впрочем он таким и задумывался.

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

Рискну просто спросить — С++ нравится? Недавно выучил? Класный язкык. Согласен. Но фанатизм не рационален.

AWW>> А "сложность" языка, это рамки которые тебе дают. Но не сложность освоения.

CC>В С++ главное в изучении языка — опыт его использования и понимание как его автоматика работает "под капотом".

Ага. Пошел я лучше в политику опять. ))
Извини.

CC>Скорее чистоплотность (посрал — смой выделил — освободи) и усидчивость (чтобы клепать boilerplates и не сойти с ума).


ага.

CC>С++ позволяет делать всё то же что и С. Какие там ограничения?


ну и тут согласен!
==
Не без обид, просто мы как дураки одно и тоже говорим... А зачем... ? Хз.
Не все кто уехал, предал Россию.
Re[8]: Достаточно ли знать С без знания С++ для устройства на работу?
От: Andrew.W Worobow https://github.com/Worobow
Дата: 06.09.14 14:27
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Не знаком, но вдоволь наобщался с до боли похожими персонажами.


Все, ... абсолютно все,... люди индивидуальны, и никогда не следует обобщать.
Не все кто уехал, предал Россию.
Re[12]: Достаточно ли знать С без знания С++ для устройства н
От: smeeld  
Дата: 06.09.14 15:17
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>В С++ добавились вещи, которые уже надо понимать как они устроены и работают, чтобы понимать их неявные эффекты.

CC>В других языках уменьшили вероятность банальных ошибок, но появились возможности создания себе комплексных проблем при непонимании как работает его автоматика.

Смею доложить, что Вы не правильно поняли стандарт С++. Его суть. По своей сути весь стандарт-повествование
о том как съесть фугу, и не откинуть при этом ласты. Да, там много схем, неявно реализуемых конструкциями синтаксиса,
которые описываются несколькими страницами занудного повествования. Но, если вникнуть в их суть, то выясняется, что они все не есть
схемы, которые обеспечивают скомпиленному приложению какие-то особые качества скомпиленного кода, связанные
с повышением безопасности, или производительности кода, а есть костыли и подпорки, которыми снимают откровенные проколы в языке,
корень которых лежит в самом дизайне языка, и подобных проблем нет в других языках. Чтоб в это убедится в том что все якобы крутые,
предоставляющие большие возможности схемы, реализуемые неявно явными синтаксическими конструкциями, просто болтовня теоретиков,
внимательно поизучайте, скомпиленный с упомянутых конструкций, код. Сравните с тем, что получается с Сишного и любого другого, хоть с Lisp-a.
У меня после таких исследований появилось впечтление что С++ — это какой-то очередной мыльный пузырь, раздутый N-ым количество академиков.
Ничего, кроме некоторых удобств и упрощений для разработчика, как уже говорил Andrew.W Worobow, С++ на самом деле не предоставляет
в своей реальной имплементации существующими компиляторами.
Re[3]: Достаточно ли знать С без знания С++ для устройства на работу?
От: sergey2b ЮАР  
Дата: 06.09.14 16:13
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Кстати, мыщъх, а что там с Lisp-ом? Встречается где или нет?


Встречаеться в CAD, у меня недавно был проект портировать 15k строк с lisp на C

относительно топика востребованности С
в 3 компаниях куда меня нанимали как С++ программиста код оказался на С или на С с классами


помему используют С тк он проше чем С++ для обучения инженеров
на код без слез невзглянеш, когда тут кто то жаловаллся что в проекте в одном файле 10k строк то могу точно сказать не видели они настояшей американской жесте по размеру функий и файлов в строках


раз здесь собрались матерые Сишники
подскажите пожалуйста как лучше решить такую задачу на С
нужен динамический список (лучше array но можно list)
который динамически меняет размер от 0 до 0.5G +- каждые несколько секунд
софтина серверная 24x7, просто зарезервировать полгига (может не хватить) на все время работы программы незлья пользователь не поймет этого
Re[13]: Достаточно ли знать С без знания С++ для устройства н
От: CreatorCray  
Дата: 06.09.14 21:22
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

CC>>Писать на нём не сложно, писать на нём громоздко. Повышается вероятность тупой ошибки в стиле "просмотрел" или "забыл".

AWW>Ну дык елы палы )) — вероятность ошибки и есть то что требует высокой квалиф.
Да не квалификация это, просто внимательности и усидчивости. А это такие свойства что даже у квалифицированного спеца могут заканчиваться время от времени.

AWW>Рискну просто спросить — С++ нравится?

Всё относительно.

AWW> Недавно выучил?

Лет 15 уже как пишу на С++ и С за деньги.

AWW> Не без обид, просто мы как дураки одно и тоже говорим... А зачем... ? Хз.

Ну не обижайся, просто у нас видимо разное понимание термина "квалификация".
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[9]: Достаточно ли знать С без знания С++ для устройства на работу?
От: CreatorCray  
Дата: 06.09.14 21:22
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

CC>>Не знаком, но вдоволь наобщался с до боли похожими персонажами.

AWW>Все, ... абсолютно все,... люди индивидуальны, и никогда не следует обобщать.
В каких то вещах — да, но в основе разница невелика.
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[11]: Достаточно ли знать С без знания С++ для устройства
От: CreatorCray  
Дата: 06.09.14 21:22
Оценка:
Здравствуйте, eskimo82, Вы писали:

E>Как я понял из соседнего разговора — ты все смешал в кучу и не понимаеш, что SEH и плюсовые исключения — это совершенно разные вещи

E>хотя, конкретно в виндах у микрософтовского компилятора С++ исключения реализуются на базе SEH.
Напомню: мы вели разговор о практической примененимости С++ в ядре, что требует тесной интеграции с предоставляемым ОС функционалом. В винде такой функционал позволяет использовать С++ исключения в ядре, т.к. исключения виндовые компиляторы традиционно раелизуют через SEH.
Рассматривать реализацию в отрыве от ОС просто не имеет смысла.

E> Причем, чтобы это работало, внутри ядра должн быть закреплен фильтр SEH из userspace runtime который знает про формат сгенерированных твой любимой студией стековых фреймов.

Userspace тут вообще ни при делах, в DDK свой рантайм и свой компилятор. Драйвера собираются им.

E> А надо сказать, этот формат для разных студий отличается.

Да всё равно, unwind производится кодом этого же модуля, исключения наружу выпускать нельзя — будет совершенно законный BSOD.

E> Ты хоть понимаеш каким диким говнокодом тебе придется осуществлять поддержку ++ ?

Ещё раз, у нас это вообще то уже лет пять назад работало в production.

E>Что касается gcc то там С++ исключения реализованы по другому. Поэтому ты не сможеш просто-так собрать модуль ядра с поддержкой исключений.

Кстати, а чем же так отличается GCC реализация что в линуксовом кернеле её нельзя использовать для бросания исключений внутри модуля?

E> Более того, если ты вдруг собереш свой приплюсный виндово-ядровый код другим компилятором, или даже другой версией студии у тебя будет масса интересных сюрпризов.

В винде драйвера собираются с помощью DDK, там вообще свой компилятор идёт в комплекте.

E> Ты вообще соображаеш какую говнояму ты таким образом выкапываеш для дальнейшей поддержки твоего кода ?

Я прекрасно понимаю как оно внутри работает. 4 года поддерживали, никаких проблем.

E>Ты даже не понял о чем я говорю.

Про макросы.

CC>>Я в тот проект пришёл когда там линуксоиды со стажем все свои макросы уже написали. И занимались увлекательным делом — пытались с этим всем взлететь.

E>И, пока ты там не появился, весь в белом и на коне, ничего взлететь не могло. Ага, унылый сказочник.
Нет, я занимался другими вещами, попутно наблюдая за их танцами с саблями.

E>>>Ты просто не умееш с ними работать.

CC>>Можно я буду так отвечать всем, кто кричит что С++ плохой?
E>А кто-то кричит что С++ плохой?
Ну вот например недалеко товарищ пишет:

Имеенно тогда увидел его уродливость С++. С++-кривое, уродливое безобразие.


E>Ты опять мешаеш всё в кучу, толи по глупости, толи из-за не понимания. Аксес виолайшен — это SEH исключение, оно из более низкого уровня абстракции. В языке С++ нет никаких access violation.

Ты ж сам только что писал что в винде вся исплементация рантайма для исключений сделана через SEH, забыл? Поэтому что SEH что С++ исключение в ядре суть одно и то же, только с разными параметрами.

E>_CxxThrowException — это функция из рантайма С++ предназначена для выполнения в user space mode.

Если пишешь в кернеле — там свой рантайм.

E>RtlRaiseException — это опять же функция рантайма (но уже системного) и она предназначена для выполнения в user space mode.

ZwRaiseException. Писал по памяти.

E>При этом у С++ исключений есть специальный идентификатор, по которому его внутри фильтра можно отличить и разобрать фрейм сгенерированой студией.

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

CC>>Можно прикрутить RTTI, можно сделать свои классы с блекджеком и всем что к нему прилагается.

E>Тебе это придется делать в любом случае — что бы понять что за исключение ты поймал и надо ли продолжать раскрутку стека.
__except позволяет решать этот вопрос без RTTI.

E>Ты хоть понимаеш сколько малокоректного говнокда из полухаков это стоит ? Такое достойно только зеленого юнца воображающего себя кулхацкером. На самом деле — это даже не смех, а сплошные слезы глядя на этого горе-кулхакера.

На сколько поинтов выросло твоё ЧСВ при написании этой фразы?

E>>>Особбенно совмещение неопределенных точек возврата с сишным кодом ядра.

CC>>Не понял про что ты?
E>У сишного кода есть четко обозначеные точки возврата "наверх". Использование исключений дает неопределенныые точки возврата — раскрутка стека может произойти в любом месте. Сишный код такого эээ несколько не ожидает.
Ещё раз, исключение не должно покинуть модуль.

E>Для начала тебе надо самому понять почему так, как ты описал выше, делать нельзя. К сожалению, ты неквалифицирован.

+10 к ЧСВ?

E>Потому что в винде — это хак

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

E>в основе которого лежит использование того факта, что один единственый компилятор поддерживает механизм С++ исключений на основе системного механизма SEH.

В линуксе же таких возможностей и вовсе нету.

E>Это у тебя руки из задницы.

+10 к ЧСВ?

E>Нормальным разработчикам.

Под нормальным разработчиком ты явно понимаешь себя.
+100 к ЧСВ?

CC>>Дада, она уже чёрти сколько лет вот вот помрёт. Осталось подождать ещё совсем немного.

E>А помрет она из-за таких вот горе-программистов.
Что то всё никак не помирает, что мы делаем не так?
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[4]: Достаточно ли знать С без знания С++ для устройства на работу?
От: smeeld  
Дата: 06.09.14 22:42
Оценка: -1
Здравствуйте, sergey2b, Вы писали:

S>нужен динамический список (лучше array но можно list)

S>который динамически меняет размер от 0 до 0.5G +- каждые несколько секунд
S>софтина серверная 24x7, просто зарезервировать полгига (может не хватить) на все время работы программы незлья пользователь не поймет этого
Можно массив с эффектом непрерывного array только запись/чтение, управление через функции.

#define MASS_NODE (2<<20)
#define NODE_NUMBER (2<<9)
#define MAX_SIZE ((2<<29)-(2<<20))

size_t grow_buffer(void* glob_ptr, size_t sz){
unsigned long* tmp=(unsigned long*)glob_ptr, *nxt;
size_t current_size=*tmp;
size_t mas=MASS_NODE;
void* p;
if((sz > MAX_SIZE) || (current_size >= sz)) return current_size;
while(current_size < sz){
current_size+=mas;printf("RS %d Sz==%d\n", mas, sz);
nxt=tmp+current_size/mas;
p=malloc(mas);
if(!p){current_size-=mas; break; };
*nxt=(unsigned long)p;
};
*tmp=current_size;
return current_size;
};

size_t reduce_buffer(void* glob_ptr, size_t sz){
unsigned long* tmp=(unsigned long*)glob_ptr, *nxt;
size_t current_size=*tmp;
size_t mas=MASS_NODE;
void* p;

while(current_size>sz){
nxt=tmp+current_size/mas;
p=(void*) *nxt;
free(p);
current_size-=mas;
};
*tmp=current_size;
return current_size;
};

void* alloc_buffer(size_t sz){
unsigned long* glob_ptr;
void* p=malloc(NODE_NUMBER*sizeof(unsigned long));
if(!p) return NULL;
glob_ptr=(unsigned long*)p;
*glob_ptr=0;
if(grow_buffer(p, sz) < sz) return NULL;
return p;
};

free_buffer(void* p){
(void) reduce_buffer(p, 0);
free(p);
};
size_t read_from(void* dst, void* glob_ptr, size_t offset, size_t sz){
unsigned long* tmp=(unsigned long*)glob_ptr;
void* src;
tmp++;
size_t current_size=*tmp, mas=MASS_NODE, tail=offset, count=0, step;
if((offset>current_size) || (sz > (current_size-offset))) return 0;
src=(void*) *(tmp+tail/mas);
step=tail%mas;
src+=step;
step=sz-count;
do{
step=(step < mas) ? step : mas;
memcpy(dst+count, src, step);
tail+=step;
count+=step;
src=(void*) *(tmp+tail/mas);
step=sz-count;
}while(step);
return count;
};

size_t write_to(void* src, void* glob_ptr, size_t offset, size_t sz){
unsigned long* tmp=(unsigned long*)glob_ptr;
void* dst;
size_t current_size=*tmp, mas=MASS_NODE, tail=offset, count=0, step;
if((offset>current_size) || (sz > (current_size-offset))) return 0;
tmp++;
dst=(void*) *(tmp+tail/mas);
step=tail%mas;
src+=step;
step=sz-count;
do{
step=(step < mas) ? step : mas;
memcpy(dst, src+count, step);
tail+=step;
count+=step;
dst=(void*) *(tmp+tail/mas);
step=sz-count;
}while(step);
return count;
};

size_t current_size(void* glob_ptr){
unsigned long* tmp=(unsigned long*)glob_ptr;
return *tmp;
};
Re[5]: Достаточно ли знать С без знания С++ для устройства на работу?
От: Abyx Россия  
Дата: 06.09.14 23:38
Оценка:
Здравствуйте, smeeld, Вы писали:

у нас тут есть специальный тег для кода, если ты не знал.
In Zen We Trust
Re[12]: Достаточно ли знать С без знания С++ для устройства
От: eskimo82  
Дата: 07.09.14 01:39
Оценка:
E>>Как я понял из соседнего разговора — ты все смешал в кучу и не понимаеш, что SEH и плюсовые исключения — это совершенно разные вещи
E>>хотя, конкретно в виндах у микрософтовского компилятора С++ исключения реализуются на базе SEH.
CC>Напомню: мы вели разговор о практической примененимости С++ в ядре, что требует тесной интеграции с предоставляемым ОС функционалом. В винде такой функционал позволяет использовать С++ исключения в ядре, т.к. исключения виндовые компиляторы традиционно раелизуют через SEH.
CC>Рассматривать реализацию в отрыве от ОС просто не имеет смысла.
C++ традиционно не привязан к какой либо ОС.

E>> Причем, чтобы это работало, внутри ядра должн быть закреплен фильтр SEH из userspace runtime который знает про формат сгенерированных твой любимой студией стековых фреймов.

CC>Userspace тут вообще ни при делах, в DDK свой рантайм и свой компилятор. Драйвера собираются им.

E>> А надо сказать, этот формат для разных студий отличается.

CC>Да всё равно, unwind производится кодом этого же модуля, исключения наружу выпускать нельзя — будет совершенно законный BSOD.
Проблема в том что собственный unwind (а я так понял что у вас он собственный) невозможно сделать лучше чем сделал производитель компилятора (который более хорошо знаком с его особенностями). Тем более для виндусовых компиляторов практически всё остается недокументированым.

E>> Ты хоть понимаеш каким диким говнокодом тебе придется осуществлять поддержку ++ ?

CC>Ещё раз, у нас это вообще то уже лет пять назад работало в production.
То что это как-то работало в момент написания — нет сомнений. Более интересный вопрос — а сейчас то работает ? Если пересобрать другой версией компилятора — будет работать ?

E>>Что касается gcc то там С++ исключения реализованы по другому. Поэтому ты не сможеш просто-так собрать модуль ядра с поддержкой исключений.

CC>Кстати, а чем же так отличается GCC реализация что в линуксовом кернеле её нельзя использовать для бросания исключений внутри модуля?
Надо писать собственную реализацию раскрутки стека. Учитывая то, что ABI С++ постоянно нестабилен (как в винде, так и в линуксах), то поддержка этого кода для разных версий gcc становится проблемой. В тех же виндах стековый фрейм с информацией о catch меняется от версии к версии — каике-то поля добавляются, какие-то исчезают.
Вторая проблема, как я уже говорил, состоит в сопряжении уже существующего сишного кода с исключениями. Сишные код не предполагает что точка возврата может произойти в любом месте, и поэтому в нем изначально нет никакой exception-safety.

E>> Более того, если ты вдруг собереш свой приплюсный виндово-ядровый код другим компилятором, или даже другой версией студии у тебя будет масса интересных сюрпризов.

CC>В винде драйвера собираются с помощью DDK, там вообще свой компилятор идёт в комплекте.
Это компилятор С++ ? Он развивается ? У него одна единственая версия ?

E>> Ты вообще соображаеш какую говнояму ты таким образом выкапываеш для дальнейшей поддержки твоего кода ?

CC>Я прекрасно понимаю как оно внутри работает. 4 года поддерживали, никаких проблем.
А 10 лет сможете поддерживать ?

E>>Ты даже не понял о чем я говорю.

CC>Про макросы.
Про макросы, но про немного другие макросы, чем ты себе представляеш.

CC>>>Я в тот проект пришёл когда там линуксоиды со стажем все свои макросы уже написали. И занимались увлекательным делом — пытались с этим всем взлететь.

E>>И, пока ты там не появился, весь в белом и на коне, ничего взлететь не могло. Ага, унылый сказочник.
CC>Нет, я занимался другими вещами, попутно наблюдая за их танцами с саблями.
Т.е. ты не знаком с деталями танцев, а делаеш вывод глядя со стороны ?

E>>>>Ты просто не умееш с ними работать.

CC>>>Можно я буду так отвечать всем, кто кричит что С++ плохой?
E>>А кто-то кричит что С++ плохой?
CC>Ну вот например недалеко товарищ пишет:
CC>

Имеенно тогда увидел его уродливость С++. С++-кривое, уродливое безобразие.

Он пишет про уродливость (в каком-то его понимании), а не про то, что язык плохой.

E>>Ты опять мешаеш всё в кучу, толи по глупости, толи из-за не понимания. Аксес виолайшен — это SEH исключение, оно из более низкого уровня абстракции. В языке С++ нет никаких access violation.

CC>Ты ж сам только что писал что в винде вся исплементация рантайма для исключений сделана через SEH, забыл? Поэтому что SEH что С++ исключение в ядре суть одно и то же, только с разными параметрами.
Нет. Ты допускаеш грубую ошибку — путая уровни абстракции — либо ты пишеш на С++ и не знаеш ни о каких access violation, либо ты пишеш на каком-то другом, своем собственном, языке.
Это тоже самое, например, что в коде на С++ исилено использовать низкоуровневые функции Си, с соответсвующими следствиями.

E>>_CxxThrowException — это функция из рантайма С++ предназначена для выполнения в user space mode.

CC>Если пишешь в кернеле — там свой рантайм.
Может быть. По памяти — студия вообще может дергать несколько вариантов, что-то вроде _CxxThrowException, _CxxThrowExcept3, etc..

E>>RtlRaiseException — это опять же функция рантайма (но уже системного) и она предназначена для выполнения в user space mode.

CC>ZwRaiseException. Писал по памяти.

E>>При этом у С++ исключений есть специальный идентификатор, по которому его внутри фильтра можно отличить и разобрать фрейм сгенерированой студией.

CC>В случае когда пишешь драйвер используется компилятор и его либы из DDK. Сама студия уже особой роли не играет.
Это не зависит от используемого компилятора, т.к. этот идентификатор стандартизирован внутри микрософта. А вот сгенерированые фреймы имеют кучу различных версий свой структуры.

CC>>>Можно прикрутить RTTI, можно сделать свои классы с блекджеком и всем что к нему прилагается.

E>>Тебе это придется делать в любом случае — что бы понять что за исключение ты поймал и надо ли продолжать раскрутку стека.
CC>__except позволяет решать этот вопрос без RTTI.
Этот вариант даже еще хуже чем собственый unwind. В первом случае — у тебя хотя бы весь бойлерплайтный код вынесен в одно место. В этом же случае — он размазан тонким слоем по всему телу драйвера. Причем получаемый вариант — это совсем даже не С++, а непонятный набор костыликов и веревочек, играть с которыми нужно по нестандартным правилам, известным лишь только автору. Отладка макросов, даже криво написанных, по сравнению с отладкой такого спагети может оказаться милым цветочком.

E>>Ты хоть понимаеш сколько малокоректного говнокда из полухаков это стоит ? Такое достойно только зеленого юнца воображающего себя кулхацкером. На самом деле — это даже не смех, а сплошные слезы глядя на этого горе-кулхакера.

CC>На сколько поинтов выросло твоё ЧСВ при написании этой фразы?
Ни на сколько, просто констатирую факт.

E>>>>Особбенно совмещение неопределенных точек возврата с сишным кодом ядра.

CC>>>Не понял про что ты?
E>>У сишного кода есть четко обозначеные точки возврата "наверх". Использование исключений дает неопределенныые точки возврата — раскрутка стека может произойти в любом месте. Сишный код такого эээ несколько не ожидает.
CC>Ещё раз, исключение не должно покинуть модуль.

E>>Для начала тебе надо самому понять почему так, как ты описал выше, делать нельзя. К сожалению, ты неквалифицирован.

CC>+10 к ЧСВ?
Архитектура, которую ты описал, состоит из костылей и палочек. И это совсем даже не С++.

E>>Потому что в винде — это хак

CC>Т.е. решение использовать готовый и прекрасно работающий системный механизм исключений для реализации поддержки языковых исключений в рантайме это хак?
Хаком является пришитые белыми нитками С++ исключения внутри ядра. Причем в твоем варианте пришиты очень безобразно.

CC>Ах ну да, надо было написать свой, ни с чем не совместимый.

Трудолюбивый дурак порой даже хуже диверсанта.

E>>в основе которого лежит использование того факта, что один единственый компилятор поддерживает механизм С++ исключений на основе системного механизма SEH.

CC>В линуксе же таких возможностей и вовсе нету.
См. выше.

E>>Это у тебя руки из задницы.

CC>+10 к ЧСВ?
Просто констатирую факт.

E>>Нормальным разработчикам.

CC>Под нормальным разработчиком ты явно понимаешь себя.
CC>+100 к ЧСВ?

CC>>>Дада, она уже чёрти сколько лет вот вот помрёт. Осталось подождать ещё совсем немного.

E>>А помрет она из-за таких вот горе-программистов.
CC>Что то всё никак не помирает, что мы делаем не так?
Вы всё делаете так, просто надо удвоить усилия.
Re[28]: Достаточно ли знать С без знания С++ для устройства
От: eskimo82  
Дата: 07.09.14 01:47
Оценка: -3
ХГД>>>Обиделся и начал хамить, сомневаться в квалификации и обсуждать личность собеседников? Ай-ай-ай, стыд и позор.
E>>Будь добр, ответь на поставленый вопрос.

ХГД>Код в студию сначала. Равно как и версии всего софта, что использовался. Не охота гадать по каким-то мутным сказкам.

В этом коде несколько миллионов строк, над ним одновременно работают больше сотни человек. Ты столько прочесть не сможеж.

Вот тебе воодная:
На устройстве — несколько дырок ефернета, немного юсб и разьем питания.
Собрали сборку — ничего не работает. Зайти по ssh невозможно.
Будь добр, озвучь свои дальнейшие действия.


E>>Об остальном мы поговорим позже.

ХГД>Да о чем с тобой, хамлом, разговаривать
Досвидание, засранец.
Re[4]: Достаточно ли знать С без знания С++ для устройства н
От: eskimo82  
Дата: 07.09.14 01:59
Оценка:
S>раз здесь собрались матерые Сишники
S>подскажите пожалуйста как лучше решить такую задачу на С
S>нужен динамический список (лучше array но можно list)
S>который динамически меняет размер от 0 до 0.5G +- каждые несколько секунд
Можно подробнее — что за список ?

S>софтина серверная 24x7, просто зарезервировать полгига (может не хватить) на все время работы программы незлья пользователь не поймет этого

Что за система ? Можно зарезервировать часть виртуального адресного пространства, но не коммитить физические страницы.
Линукс, кстати, так и делает — пока в страницу ничего не запишеш, её и как бы и нет. Так что там можеш спокойно аллок сделать и на полгига, но если физической памяти (вместе со свопом) хватать не будет то могут и прибить.

Если просто нужен большой массив — можно приметить патерн "разреженный массив". Т.е. весь массив разбивается на страницы (или на более глубокую иерархию) и аллоцирууются только нужные страницы. Кстати, одну из реализаций можно подсмотреть в ядре — там есть специальный обьект.
Если массив "дышит" с какой-то переиодичностью, то хвостовые страницы можно отдавать системе с некотрым таймаутом, большим чем эта периодичность.
Отредактировано 07.09.2014 2:08 eskimo82 . Предыдущая версия . Еще …
Отредактировано 07.09.2014 2:06 eskimo82 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.