The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Обзор проблем в коде на C/C++, вызванных неопределённым пове..., opennews (ok), 07-Июл-17, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


4. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +16 +/
Сообщение от A.Stahl (ok), 07-Июл-17, 12:04 
Многие профессионалы сталкиваются с ситуацией, когда они сами пишут и проектируют.
Соответственно они это делают как им удобно.
Вот, например, я -- терпеть не могу шаблоны. STL использую, но сам не пишу. Это такой мой "бзик". Также я не уловил прелесть смартпоинтеров. У меня и с обычными указателями никаких проблем нет. Нахрена мне умные?
А вот теперь представь, что я  -- тимлимд (а я на плюсах ~10 лет пишу, так что опыт имеется и на такую должность вполне могу упасть). И как себя будет чувствовать молодёжь, которая ни асма ни Си не нюхала? Я со своими требованиями буду для них "придурок, усложняющий код, когда можно написать auto". И они будут правы. И я буду прав. Вот так.
Это разница в поколениях и мировоззрениях. Классическая проблема отцов-сыновей.
Ответить | Правка | К родителю #2 | Наверх | Cообщить модератору

7. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +3 +/
Сообщение от Crazy Alex (ok), 07-Июл-17, 12:15 
А exception safety, move semantics, вот это всё - тоже игноришь? Их без умных указателей не особо реализуешь... То есть можно конечно, но возни же куча.
Ответить | Правка | Наверх | Cообщить модератору

11. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +9 +/
Сообщение от A.Stahl (ok), 07-Июл-17, 12:50 
Исключения не люблю, а вот move semantics почти не нужно если у тебя всё хорошо с обычными указателями. Если писать в Ява-стиле, то да -- эта штука реально спасает. Сишнику это не очень критично. У сишника не часто бывают нюансы когда ты "передаёшь эстафету" и умираешь:) Да и сишник всегда может передать указатель и забыть/забить.
Но да, иногда эта штука крута и прикольна. Но ничего такого.
Ответить | Правка | Наверх | Cообщить модератору

17. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +3 +/
Сообщение от Crazy Alex (ok), 07-Июл-17, 13:57 
Создать объект и отдать его контейнеру - это редкая операция? А если нет - то либо умные указатели, либо move semantics, либо с ровного места теряем в производительности на копированиях объектов.
Ответить | Правка | Наверх | Cообщить модератору

21. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +4 +/
Сообщение от A.Stahl (ok), 07-Июл-17, 15:04 
Я обычно передаю указатель. Редко бывает, когда объект нужен много кому и непонятно кто должен его удалять.
Ответить | Правка | Наверх | Cообщить модератору

26. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Crazy Alex (ok), 07-Июл-17, 15:36 
А у меня - как-то через раз. Лежит себе вектор указателей на объекты, чему-то один из них понадобился - оно его получило. Сохранило где-то или нет - с умными указателями мне не интересно, как и то, как соотносятся сроки жизней контейнера и клиента. Для стаистики, например - самое оно. Посчитал, сложил, дал интерфейс, забыл.
Ответить | Правка | Наверх | Cообщить модератору

29. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +5 +/
Сообщение от Аноним (-), 07-Июл-17, 15:58 
Код является простым когда простой инспекцией удается выловить границы жизни объекта без того чтобы тратить время на анализ исполнения. Как раз с умными, автоматическими, неявными операциями и указателями код не становится простым и понятным, получается такая "вещь в себе". Так что лучше явно.
Ответить | Правка | Наверх | Cообщить модератору

31. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +6 +/
Сообщение от A.Stahl (ok), 07-Июл-17, 16:15 
Красиво казал. Меня там минусуют, но они не совсем понимают суть. Я не против новых "фишек", просто некоторые нюансы мне не нравятся. Не более того.
Я просто стараюсь оставлять код очевидным. Очевидным даже для сишников (я и сам такой), а не только для плюсовиков, которые следят за последними стандартами.
Я не против. И никогда не использовал положение чтобы что-то запрещать. Просто некоторые вещи я не использую (даже не не использую, а избегаю использовать). Не более того.
Ответить | Правка | Наверх | Cообщить модератору

54. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Crazy Alex (ok), 07-Июл-17, 21:58 
Фишка в том, что "очевидный для сишников" и "очевидный для плюсовиков" - вещи разные, и чем больше масса кода, тем больше  в них противоречие.

Подход сишника - "каждый конкретный кусок должен быть ясен вплоть до примерного набора инструкций процессора". Подход плюсовика - "каждый конкретный кусок должен быть ясен в терминах алгоритмики и тех понятий, в которых мы пишем, а ниже лезем только при явной необходимости -  и желательно один раз, добавляя новое понятие". То самое implementation hiding, loose coupling и подобное. Идеальный пример здесь - шаблоны (в которых мы реализуем что-то очень общее) и при нужде - их специализации (где лезем в детали).

Ответить | Правка | Наверх | Cообщить модератору

60. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +1 +/
Сообщение от Аноним (-), 07-Июл-17, 22:33 
>  Фишка в том, что "очевидный для сишников" и "очевидный для плюсовиков" - вещи разные, и чем больше масса кода, тем больше  в них противоречие.

Это лишь ваше представление которое основано, к сожалению, на незнании или малоопытности программирования на Си.

> Подход сишника - "каждый конкретный кусок должен быть ясен вплоть до примерного набора инструкций процессора". Подход плюсовика - "каждый конкретный кусок должен быть ясен в терминах алгоритмики и тех понятий, в которых мы пишем, а ниже лезем только при явной необходимости -  и желательно один раз, добавляя новое понятие". То самое implementation hiding, loose coupling и подобное. Идеальный пример здесь - шаблоны (в которых мы реализуем что-то очень общее) и при нужде - их специализации (где лезем в детали).

Вообще не то. Подход сишника: узнаем как должно работать и реализуем сразу. Подход плюсовика: узнаем как должно работать и соображаем как составить код с "правильным" ООП, шаблонами и прочим трешем.

Разговоры о том что ООП - sucks идут уже давно, и первыми об этом заговорили эксперты программирования которые уперлись в проблемы ООП. Вот и я уперся в свое время и больше я ООП не трогаю если только не приходится.

Ответить | Правка | Наверх | Cообщить модератору

69. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +1 +/
Сообщение от Crazy Alex (ok), 08-Июл-17, 01:40 
Ох как забавно.

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

Так вот сюрприз - всякое "правильное" ООП, шаблоны (которые паттерны) и подобное - как раз об этом. Чтобы сделать заведомо известными, проверенными способами. Которые не только сами по себе хороши, но и другие люди их сразу поймут и будут знать, что с этим кодом делать и чего ждать.

Ну а "вот и я уперся в свое время и больше я ООП не трогаю если только не приходится" это вообще мило. Может, у вас просто мозгов не хватило? Судя по первой части - вполне может быть.

Ответить | Правка | Наверх | Cообщить модератору

74. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Аноним (-), 08-Июл-17, 04:17 
Очень забавно потому что вот это - "вменяемый разработчик вообще на любом языке будет думать не просто "как должно работать", а как обеспечить минимум багов, как упростить поддержку, как дать разумные возможности расширения, как реализовать обработку ошибок, как учесть многопоточныость и прочее" это как бы само-собой разумеющееся, и у опытных решение было уже принято где-то в момент "узнаем как должно работать". Поэтому реализуем сразу.

А то что вы пишете "Подход "узнаем как должно работать и реализуем сразу" (велосипед, как правило) - это студенческая наивность" - это выдало в вас новичка.

> Так вот сюрприз - всякое "правильное" ООП, шаблоны (которые паттерны) и подобное - как раз об этом. Чтобы сделать заведомо известными, проверенными способами. Которые не только сами по себе хороши, но и другие люди их сразу поймут и будут знать, что с этим кодом делать и чего ждать.

Согласен что design patterns на словах выглядит изумительно, но я этим переболел. Но на практике от них часто много разных проблем. Поэтому я не сторонник "размазывать" управляющую логику в паттерны, а формулирую их в юниты. Но

> Ну а "вот и я уперся в свое время и больше я ООП не трогаю если только не приходится" это вообще мило. Может, у вас просто мозгов не хватило? Судя по первой части - вполне может быть.

Судя по вашим ответам - вы тот еще нуб.

Ответить | Правка | К родителю #69 | Наверх | Cообщить модератору

80. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от pripolzemail (?), 08-Июл-17, 11:34 
> Подход сишника - "каждый конкретный кусок должен быть ясен вплоть до примерного набора инструкций процессора". Подход плюсовика - "каждый конкретный кусок должен быть ясен в терминах алгоритмики и тех понятий, в которых мы пишем, а ниже лезем только при явной необходимости -  и желательно один раз, добавляя новое понятие".

броо! +!!!
А вообще я редкостный хейтер всего кроме Си (хотя писал на 100 языках), потому, что вот эта философия новой школы "я приложу старания, для того, чтобы НЕ ЗНАТЬ, как это работает внутри" это ... сами понимаете. Не просто палка в колесо, а супер заумная палка, героически внедряемая под покровом ночи.

Ответить | Правка | К родителю #54 | Наверх | Cообщить модератору

100. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Vkni (ok), 08-Июл-17, 17:51 
> А вообще я редкостный хейтер всего кроме Си (хотя писал на 100
> языках), потому, что вот эта философия новой школы "я приложу старания,
> для того, чтобы НЕ ЗНАТЬ, как это работает внутри" это ...
> сами понимаете. Не просто палка в колесо, а супер заумная палка,
> героически внедряемая под покровом ночи.

А вы и так не знаете, не переживайте. Даже пишущий на ассемблере не знает, как оно будет выполняться на современном процессоре унутре. Даже в каком порядке.

Более того, язык Цэ разработан для однопроцессорной машины типа PDP, как известно. Соответственно, на других машинах, типа Itanium/Эльбрус или видеокарты или многопроцессорные Sparc/Power, он работает несколько неоптимально.

Ответить | Правка | Наверх | Cообщить модератору

124. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Аноним (-), 09-Июл-17, 01:44 
> А вы и так не знаете, не переживайте. Даже пишущий на ассемблере не знает, как оно будет выполняться на современном процессоре унутре. Даже в каком порядке.

Это и не нужно, во-первых. Во-вторых речь не о машинном исполнении была.

> Более того, язык Цэ разработан для однопроцессорной машины типа PDP, как известно. Соответственно, на других машинах, типа Itanium/Эльбрус или видеокарты или многопроцессорные Sparc/Power, он работает несколько неоптимально.

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

Ответить | Правка | К родителю #100 | Наверх | Cообщить модератору

127. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Vkni (ok), 09-Июл-17, 02:08 
> Это и не нужно, во-первых. Во-вторых речь не о машинном исполнении была.

Ну да, на каком-то уровне приходится останавливаться. Ну можно остановиться на ассемблере, можно выше, можно ещё выше. В зависимости от задачи оптимальность той точности, с которой разработчик понимает, что будет происходить, разная.

> Ложное утверждение. Как будет работать на процессорах зависит от того как напишешь,
> что напишешь и во что это будет оттранслировано в конечном счете.

Да. Только есть языки более приспособленные, есть менее приспособленные для определённой задачи. И слабая приспособленность С к многопроцессорным машинам приводит к тому, что приходится обвешиваться pthread'ами и соблюдать чудеса внимательности, растрачивая своё время и силы.

А в более приспособленных к параллельным вычислениям языках можно это делать значительно легче. Например, один из самых приспособленных языков к ним - это make. Чтобы распараллелить задачу на нём требуется задать один ключ -j.

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

Ответить | Правка | К родителю #124 | Наверх | Cообщить модератору

129. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  –1 +/
Сообщение от Аноним (-), 09-Июл-17, 02:46 
> Ну да, на каком-то уровне приходится останавливаться. Ну можно остановиться на ассемблере, можно выше, можно ещё выше. В зависимости от задачи оптимальность той точности, с которой разработчик понимает, что будет происходить, разная.

Зачем вообще вы снова асм тянете, я не пойму. Вот люди пишут на java и не парятся что их байткод весь внутри в goto. Или вы из тех кто совсем не умеет в си прикладные задачи алгоримтического плана?


> Да. Только есть языки более приспособленные, есть менее приспособленные для определённой задачи. И слабая приспособленность С к многопроцессорным машинам приводит к тому, что приходится обвешиваться pthread'ами и соблюдать чудеса внимательности, растрачивая своё время и силы.
> А в более приспособленных к параллельным вычислениям языках можно это делать значительно легче. Например, один из самых приспособленных языков к ним - это make. Чтобы распараллелить задачу на нём требуется задать один ключ -j.
> Понятно, что у make слишком слабый контроль за параллелизацией вычислений для системного языка, но ясно, что, тем не менее, у такого языка параллелизация может быть сделана лучше, чем у теперешнего С.

Если продолжить вашу мысль то можно еще проще сделать - запускать N-процессов и вообще нет проблем. Даже -j не нужен.

Ответить | Правка | К родителю #127 | Наверх | Cообщить модератору

130. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Vkni (ok), 09-Июл-17, 02:56 
> Зачем вообще вы снова асм тянете, я не пойму.

Ветка такая. См. несколько комментов выше.

Ответить | Правка | К родителю #129 | Наверх | Cообщить модератору

133. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Аноним (-), 09-Июл-17, 05:48 
В 12.54 Crazy Alex написал свое ОГРАНИЧЕННОЕ (!) понимание программирования в Си на что мне пришлось дать в 12.60 ему ортогональный ответ.
Вижу вы согласились с предложенным в 12.54 толкованием, но если если вы следили за веткой 12.54 -> 12.60, то должны были понять что ситуация осталась спорной.
Получается что вы все время апеллируете к асму только из-за ограниченного понимания Си прользователем Crazy Alex ? Ничего не смущает?
Ответить | Правка | К родителю #130 | Наверх | Cообщить модератору

135. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Vkni (ok), 09-Июл-17, 07:29 
> Получается что вы все время апеллируете к асму только из-за ограниченного понимания
> Си прользователем Crazy Alex ? Ничего не смущает?

Я писал недавно зарегистрировавшемуся товарищу на букву p.

Ответить | Правка | К родителю #133 | Наверх | Cообщить модератору

140. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Аноним (-), 09-Июл-17, 16:14 
Точно, сообщение 12.80 от пользователя pripolz. Но это не меняет ситуацию с постоянным обращением к асму.
Ответить | Правка | К родителю #135 | Наверх | Cообщить модератору

61. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +2 +/
Сообщение от Аноним (-), 07-Июл-17, 22:41 
Я не кравиво сказал, а рассказал как оно обстоит в реальном программировании. У меня складывается ощущение что местные кто печатает здесь заумные термины, на практике их используют примерно ноль раз. Мне нравится философия Java и еще больше нравится Си, но не вычурное ботанство С++ потому что используя "фишки" С++ ты себя просто заковываешь в кандалы. Я не вижу преимущество в С++, даже банальные перегрузки операции часто вызывают семантическую неоднозначность. То есть надо лезть и разбираться. Убого и долго.
Ответить | Правка | К родителю #31 | Наверх | Cообщить модератору

52. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Crazy Alex (ok), 07-Июл-17, 21:45 
Умные указатели сложность, в общем, не особо прибавляют, если дать себе труд раз в жизни разобраться, как они работают. Поскольку они стандартны - только один раз и надо это сделать. И тоже будет всё просто - только на других предпосылках. Там случаев-то - раз-два и обчёлся - https://github.com/isocpp/CppCoreGuidelines/blob/master/CppC... - пяток экранов на все принципы.
Ответить | Правка | К родителю #29 | Наверх | Cообщить модератору

59. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от не программист (?), 07-Июл-17, 22:23 
Я хорошо знаю и умею использовать умные указатели и для меня это уже пройденный этап. Я просто хотел указать на ситуацию когда от них больше проблем чем пользы.
Ответить | Правка | Наверх | Cообщить модератору

68. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  –1 +/
Сообщение от Crazy Alex (ok), 08-Июл-17, 01:31 
Единственная "Ситуация, когда от них больше вреда, чем пользы" - это когда в программке пятьсот строк, десяток классов и один автор. Для всего, что сложнее "простой инспекцией выловить границы жизни объекта без того чтобы тратить время на анализ исполнения" - идея заведомо идиотская. Там уже надо думать не о вылавливании сроков жизни, а о том, чтобы гарантировать и существование, и своевременное уничтожение объектов - в том числе в чужом коде, который про ваши внутренние соглашения понятия не имеет и человеком, который впервые видит ваши интерфейсы (а в реализацию в принципе не полезет). Смарт поинтеры дают для этого стандартный, понятный любому квалифицированному плюсовику инструментарий.
Ответить | Правка | Наверх | Cообщить модератору

71. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Аноним (-), 08-Июл-17, 03:55 
> Единственная "Ситуация, когда от них больше вреда, чем пользы" - это когда в программке пятьсот строк, десяток классов и один автор. Для всего, что сложнее "простой инспекцией выловить границы жизни объекта без того чтобы тратить время на анализ исполнения" - идея заведомо идиотская. Там уже надо думать не о вылавливании сроков жизни, а о том, чтобы гарантировать и существование, и своевременное уничтожение объектов - в том числе в чужом коде, который про ваши внутренние соглашения понятия не имеет и человеком, который впервые видит ваши интерфейсы (а в реализацию в принципе не полезет). Смарт поинтеры дают для этого стандартный, понятный любому квалифицированному плюсовику инструментарий.

Вы вообще программировали что-нибудь серьезное? Когда вы будете думать о том как гарантировать существование и своевременное уничтожение объекта в коде, архитектура которой прорабатывается сразу несколькими людьми, то вы будете думать над сроками жизни объекта. Все ваши "смарт поинтеры и соглашения" вылетают в трубу когда вам надо перестроить контроллеры и переработать часть архитектуры.
Я вам на основе практического опыта скажу что самый лучший вариант в подобных случаях - передать управление временем жизни объекта контроллеру. Это позволяет менять архитектуру и код как угодно и во что угодно, не ограничивая себя неповоротливыми "best practices" и не расходуя время на создание ненужных контрукции только потому что в какой-то книжке кто-то написал что это "понятный любому квалифицированному плюсовику инструментарий".
Плюсы:
1) самодокументируемый код снимяющий все неясности из-зя явных операции
2) управляющий код элементарен и может подводиться под условия (оптимизация, кеширование и прочее)
3) теперь граница жизни объекта оторвана от представления програмной конструкции, то есть можно делать что угодно с архитектурой (а мы ведь любим биндинги на другие языки?) и вам не надо думать о времени жизни объекта; можете считать это декомпозицией архитектуры

Подобное делается просто на Си, С++ и любых других языках, и особенно в Java. Скорость исполнения не страдает.

Ответить | Правка | Наверх | Cообщить модератору

58. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  –1 +/
Сообщение от Аноним (-), 07-Июл-17, 22:19 
А как же Вы обрабатываете ошибки? Я Плюсы знаю неплохо, но пишу на чистом Си. Простые задачи выношу в Питон. На обработку ошибок в Си, выставления errno и т.п. уходит иногда до половины кода (с учётом библиотеки под эти дела). Мне всегда было интересно, как у серьёзных проектов на плюсах дела с обработкой ошибок обстоят. try... намного увеличивают количество кода и уменьшают читабельность. Я уже не говорю, что я не смогу вызвать конструктор стекового объекта внутри try..., т.к. ограничу объект его областью видимости. Но в то же время программа должна корректно обрабатывать ошибки и реагировать на них. Так как Вы обходитесь без исключений то?
Ответить | Правка | К родителю #11 | Наверх | Cообщить модератору

81. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +2 +/
Сообщение от pripolzemail (?), 08-Июл-17, 11:52 
> А как же Вы обрабатываете ошибки? Я Плюсы знаю неплохо, но пишу
> на чистом Си. Простые задачи выношу в Питон. На обработку ошибок
> в Си, выставления errno и т.п. уходит иногда до половины кода
> (с учётом библиотеки под эти дела). Мне всегда было интересно, как
> у серьёзных проектов на плюсах дела с обработкой ошибок обстоят. try...
> намного увеличивают количество кода и уменьшают читабельность. Я уже не говорю,
> что я не смогу вызвать конструктор стекового объекта внутри try..., т.к.
> ограничу объект его областью видимости. Но в то же время программа
> должна корректно обрабатывать ошибки и реагировать на них. Так как Вы
> обходитесь без исключений то?

я всю обработку ошибок кладу в макрос, в котором и печать в лог номера строки кода, и вызов функции-пустышки BreakPointPit - чтобы поставить один брейкпоинт на все ошибки.
Получается универсальная проверка одной строчкой:
CHECK(statement, ERR_CODE);

Освобождение ресурсов при выходе обеспечивается goto ErrorLabel вместо простого return;

Ну я сишник, как ты понял. А плюсовики на моём опыте просто не обращают внимания. Присвоил локальной преременной new, и пошёл дальше. Выделится память или не выделится, бросит ли кто-то эксепшн дальше в функции, да пофигу. Они слишком уверенны в идеальности своих инструментов

Ответить | Правка | Наверх | Cообщить модератору

119. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Аноним (-), 08-Июл-17, 22:47 
Ну, у Вас по сути примерно такая же обработка ошибок, как и у нас. А про плюсовиков, - да, скорее всего такая тенденция есть с языками более высокого уровня. Потому и спрашивал про серьёзные проекты. Ведь выделение памяти в ресурсоёмких приложениях должно быть проверяемым. Я например, в случае невозможности выделить память, просто сбрасываю кэш. Будет работать медленнее, но зато будет. Правда тут тоже нюансы, - другие приложения, на которые идёт завязка могут просто скрешиться. В том же GTK нет смысла обрабатывать полноценно ошибки, т. к. сам GTK в любой момент может сделать assert на невыделенной памяти. Но это проблема частично решаемая разными способами.
Ответить | Правка | Наверх | Cообщить модератору

121. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Vkni (ok), 08-Июл-17, 23:54 
> Освобождение ресурсов при выходе обеспечивается goto ErrorLabel вместо простого return;

Их должно быть несколько, если выделяются сразу несколько ресурсов. И не перепутать порядок. А если ресурсы выделяются/освобождаются в цикле, то так уже не получится сделать:

for( int i = 0; i < 5; i++)
{
    f = fopen(file[i],"rt");
    ...
      <глобальная ошибка>
    ...
    fclose(f);
}

Ответить | Правка | К родителю #81 | Наверх | Cообщить модератору

126. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  –1 +/
Сообщение от pripolzemail (?), 09-Июл-17, 02:08 
инициализация нулями спасёт мир

for (int i = 0; i < 5; i++)
    if (f[i])
        fclose(f[i]);

Ответить | Правка | Наверх | Cообщить модератору

128. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Vkni (ok), 09-Июл-17, 02:14 
> инициализация нулями спасёт мир

Это костыль под конкретный случай. Взять какую-нибудь другую структуру и опа.

Ответить | Правка | Наверх | Cообщить модератору

131. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от pripolzemail (?), 09-Июл-17, 03:29 
> инициализация нулями спасёт мир
> for (int i = 0; i < 5; i++)
>     if (f[i])
>         fclose(f[i]);

упс, не по теме написал. Сори.

Ответить | Правка | К родителю #126 | Наверх | Cообщить модератору

136. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Аноним (-), 09-Июл-17, 09:15 
У нас на метки с освобождением ресурсов и восстановлением уходит до половины тела функций. В функциях инициализации их может быть и 10, и 15. А если цикл с выделением памяти, к примеру,  - то подобные куски кода выгоднее выносить в отдельные функции. По ошибке обходить цикл в обратку и всё освобождать. Тогда код основной функции будет более читабельным.
Ответить | Правка | К родителю #121 | Наверх | Cообщить модератору

13. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  –2 +/
Сообщение от yet another anonymous (?), 07-Июл-17, 12:56 
> exception safety, move semantics, ...  Их без умных указателей не особо реализуешь...

Бред.

Ответить | Правка | К родителю #7 | Наверх | Cообщить модератору

18. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Crazy Alex (ok), 07-Июл-17, 14:00 
Говорю же - можно, но морока. Придётся самому отслеживать все случаи, когда надо прибить указатель - а ради чего?

Что характерно - это ж не я придумал, можете любого плюсового гуру поглядеть - здесь разногласий нет с того самого 11-го года.

Ответить | Правка | Наверх | Cообщить модератору

22. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от yet another anonymous (?), 07-Июл-17, 15:05 
move не имеет к *_ptr отношения. *_ptr подразумевают move. (при достаточно полной реализации). Поэтому "для реализации move-семантики нужны умные указатели" --- набор слов, не складывающийся в осмысленную фразу.

Если фраза подразумевала
"при релизации move-семантики объекта обязательно нужны умные указатели", то тоже бред выходит: это зависит от объекта.

> А exception safety, move semantics, вот это всё - тоже игноришь? Их без умных указателей не особо реализуешь...

Ответить | Правка | Наверх | Cообщить модератору

23. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Crazy Alex (ok), 07-Июл-17, 15:31 
Нет. Подразумевалось "умные указатели радикально упрощают реализацию move-семантики". Если у тебя поля - обычные указатели, тебе надо для каждого выяснить, как именно он инициализируется, кто им владеет и так далее. Если умные - из типа всё очевидно и есть стандартные правила обращения с ними. Когда речь не о программках из десятка классов - это принципиально.
Ответить | Правка | Наверх | Cообщить модератору

35. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от yet another anonymous (?), 07-Июл-17, 17:18 
Т.е. второй вариант.

Мне нравится такой подход: неявно подразумевается вполне определённая реализация с вполне определёнными предположениями/гарантиями/etc. Все остальное объявляется несущественным/неактуальным/безнадёжно устаревшим и т.п. Так держать! Вы победитель!

Ответить | Правка | Наверх | Cообщить модератору

53. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Crazy Alex (ok), 07-Июл-17, 21:51 
Оно везде так. Называется "best practices". Использование ничего-то отличающегося надо обосновывать, потому что для этого отличающегося нет сто раз проверенных методов применения, возможных граблей и их обходов, оценок эффективности, готовых инструментов и прочего. В софте это, собственно, гораздо слабее выражено, чем в других областях инженерии, так что не вам бы плакаться.
Ответить | Правка | Наверх | Cообщить модератору

25. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от kai3341 (ok), 07-Июл-17, 15:35 
Или ещё вариант: на этапе проектирования закладывается больше гибкости и универсальности.
Если она вся не используется, код переусложнён. Тогда говорят "Фу, оверинжениринг".
А вот если её становится недостаточно, начинается адище.
Ответить | Правка | К родителю #4 | Наверх | Cообщить модератору

34. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  –3 +/
Сообщение от anonymous (??), 07-Июл-17, 17:13 
> И они будут правы.

Они будут правы.

> И я буду прав.

А вот вы не будете. Будете старым пердуном, который не успевает за ритмом развития инструмента, но прикрывается словами о простоте и 10 годах опыта.

Ответить | Правка | К родителю #4 | Наверх | Cообщить модератору

82. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от pripolzemail (?), 08-Июл-17, 12:30 
>> И они будут правы.
> Они будут правы.
>> И я буду прав.
> А вот вы не будете. Будете старым пердуном, который не успевает за
> ритмом развития инструмента, но прикрывается словами о простоте и 10 годах
> опыта.

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

Так что, всё как раз наоборот. Они не будут правы (просто не знают проблем), а он прав будет, потому что знает, а не не знает.

Ответить | Правка | Наверх | Cообщить модератору

97. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от anonymous (??), 08-Июл-17, 17:32 
> В конце он приходит к выводу, что
> инициализируя auto "хорошо бы добавить статик каст".

Правда? Может вы что-то не так вычитали? А если так, то замените auto на что-то конкретное вот в таком случае, например:

auto local_fn = [&](auto & a) {...};

Ну или static_cast вставьте где-нибудь, где вам больше нравится.

А еще попробуйте обойтись без auto внутри шаблонов, что-то вроде:

template<typename A, typename B> auto f(A a, B b) {
  auto tmp = a + b;
  ...
  return tmp + 1;
}

> Так что, всё как раз наоборот. Они не будут правы (просто не
> знают проблем), а он прав будет, потому что знает, а не
> не знает.

Он как раз не знает. И не использует то, чего не знает и боится.

Ответить | Правка | Наверх | Cообщить модератору

99. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Vkni (ok), 08-Июл-17, 17:46 
> Почитайте книгу "Современный и эффективный С++". Там автор докажет вам, что auto
> - тот ещё фрукт.

Можно ссылку?

Ответить | Правка | К родителю #82 | Наверх | Cообщить модератору

105. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от pripolzemail (?), 08-Июл-17, 19:29 
>> Почитайте книгу "Современный и эффективный С++". Там автор докажет вам, что auto
>> - тот ещё фрукт.
> Можно ссылку?

Там ниже в беседе кидали на магаз О-Райли. Effective Modern C++ Майерса.

Ответить | Правка | Наверх | Cообщить модератору

110. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..."  +/
Сообщение от Vkni (ok), 08-Июл-17, 19:57 
> Там ниже в беседе кидали на магаз О-Райли. Effective Modern C++ Майерса.

А-аа, Майерс. Просто modern C++ - это в разные времена совершенно разное.

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру