Я сказал как писать лучше, вы — предложили писать на другом языке — зачем? непонятно
Ну вске было не так, речь шла конкретно и динамических массивах, вы зачем-то начали предлагать вектор ... мотивируя это тем что тогда не надо сделать за утечками пасяти и пр. просто если не надо ни за чем следить и вообще можно обстрагироваться выше, то зачем это вообще?
делаю вывод - на плюсах есть смысл писать только говнокод, иначе проще взять питон
коротко: ты не шаришь, извини
https://t.me/supapro/793402
Так я и не притендовал на то что я шарю))
т.е. низкоуровневый код на плюсах - это говнокд?
использование new [] при отсутствии резонных на то причин - говнокод
почему, потому что можно забыть его удалить? или в чем он так плох?
в 2021 году, со всей тонной инженерного опыта, который был накоплен за десятилетия, это очень плохо
в том, что в С++ - минное поле, в любой момент может выскочить исключение, а ресурс незащищен. даже если ты аккуратно напишешь delete, до него может не дойти
С++ пропагандирует такую вещь как Zero-Cost Abstractions. Автоматическое управление памяти по определению лучше ручного, потому что оно уменьшает когнитивную нагрузку с писателя программы по управлению ресурсами и их владением и при чтении программы её легче понять, когда у тебя владение ресурсом явно обозначено абстракциями, сырые указатели не предоставляют таких средств. Если вы хотите динамический массив, у которого нельзя будет поменять размер после создания, при этом, чтобы это был не const vector, то есть чтобы сами элементы можно было менять — то надо использовать std::unique_ptr<T[]> Я его не посоветовал новичку, потому что это будет скорее усложнение для новичкового кода, а вектор — достаточно нормальный компромисс, чтобы избежать говнокода в виде ресурса без явного указания владения.
https://stackoverflow.com/questions/7620385/why-is-it-a-bad-idea-to-use-new
При использовании 98 стандарта - это тоже плохо?
Ну простите, я то думал что весь сахар всего этого в том что есть возможнось самостоятельно управлять ресурсами, а оказывается все уже давно нет.
в C++98 всё же есть RAII, на худой конец - auto_ptr
Нас за авто дрючили в универе. На данный момент у меня о нем плохое мнение за такое обучение
он был проблемный в плане измененной семантики копирования, но функцию свою выполнял.
какой стандарт был в универе?
98, я спрашивал, почему не 11, я в 11 году поступил. Сказали типа такая программа, хотите новее - изучайте сами
У тебя есть такая возможность, но пользоваться ей имеет смысл только внутри RAII обёртки, которая в итоге будет делать это за тебя. А так да - ручное управление ресурсами это сложно, а программист стремится уменьшать сложность программы
Первая версия программы: int* arr = new int[10]; ... delete[] arr; Кто-то добавил код, который бросает исключение: (и хорошо если они не забыли добавить try/catch) int* arr = new int[10]; try { ... // exception } catch (...) { delete[] arr; } delete[] arr; Тоже самое с вектором в любой версии программы std::vector<int> arr(10); А теперь ещё представь что в первой версии передавался указатель куда-то и сохранялся и не дай бог ты воспользуешься им после удаления. Или ты передал его в функцию, которая делает вычисления и в новой версии программы там добавили строчку, которая удаляет этот массив, а твой код не поправили и получается double free.
Да лучше уж свой scoped_ptr наговнякать или буст взять
Без мув семантики как ты scoped_ptr наговнякаешь? Запретишь копирование?
Ну с такой точки зрения я не рассматривал) Опять же я не собирался юзать плюсы для прода и тем более уж работать на них. Но в целом я понял, в случе рабоы командой кто-то можеи просто сломать программу. В данном случае автоматическое управление действительно было бы удобней и отказоусточиваей.
В большинстве случаев важна корректность программы и её поддерживаемость. Ручное управление ресурсами редко даёт бенифиты.
Да не кто-то, а ты сам через пол года
Ну а в бусте по твоему как сделано?) Если что, scoped_ptr == const unique_ptr
Да даже не в случае командной работы, ты через неделю просто можешь забыть что ты как реализовал и сам себе на грабли наступить
Ну мне по сути нужны плюсы для программирования микрух и делать я буду это в одно лицо. А с учтом весьма ограниченного колзва ресурсов лучше наверно будет менеджерить их руками? Или все же можно юзать обстракции и это не сильно будет тянуть?
Ну да, звучит логично 💁
Рекомендую попробовать написать хорошо с точки зрения кода, а если микруха не вытянет, то переписывать на плохо)
Тогда не было буста, если не ошибаюсь
98 стандарт
Буст появился в начале нулевых
ну там 80mHz и 1.5 метра для прошивы ... =) ладно, понял, короче не стоит лезть во все это вот управление и попытаться все же начать с абстракций. Просто сколько я либ для рабоыт с теми или иными датчиками/мониторами не открывал, там все написано без абстракций. Ну и там cpp11
С++ предоставляет варианты как получать неабстрагированные данные из абстракций Условно — метод data у вектора
Ну т.е. берем абстракцию, а если надо то работаем с сырыми данными из неё? А астракция чисто для защиты от утечек памяти и стабтльности?
приложение можно условно разделить на несколько компонент, каждая из которых работает на своём уровне абстракции. если в соседних строчках написаны new и std::vector, это печально
Ну пока у меня ничего не написано) мне пока надо реализовать мессив фиксированной длинны в который можно толкать данные в конец и при его заполнении, которые должны вываливаться из начала) Я пошел пока что через шаблон т.к. там могут быть разные данные и разная размреность. Надо на основе этого массива будет рисовать граффик на мониторчике. Благо этот код для пет проекта ))
Если размер задаётся на этапе компиляции, то юзай параметр шаблона (число) + std::array<T, N>. Если на этапе выполнения, то юзай std::unique_ptr<T[]> + std::make_unique<T[]>.
Обсуждают сегодня