Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 5
×
Senior C++ Overengineer
  • С++20 Сoroutines та огляд бібліотек, які реалізують підтримку со-програм

    Саме тому, що всі імена, що починаються з двох _, а також з одного _ і великої букви, зарезервовані для стандартної бібліотеки.
    Її внутрішні деталі реалізації використовують такі імена, щоб гарантувати відсутність колізій з клієнтськими макросами. Бо ти маєш право зробити #define foo bar, потім заінклюдити стандартний хедер, і гарантовано в ньому нічого не зламаєш. Але якщо напишеш #define __foo bar — можеш поламати, ССЗБ.

    Щодо імен, які починаються з одного нижнього підкреслення, за яким не слідує велика буква, — їх можна юзати в обмеженому скоупі (поля класів, локальні змінні). На попередній роботі був конвеншн юзати такі назви для приватних змінних у класі.
    На поточній юзаємо m_. Спочатку було незвично, але виявилось теж доволі зручно. Це ж все-таки не угорська нотація, яка зашиває в назву змінної її тип. Ось вона — то вже перебор, як на мене.

    Підтримав: Denys Poltorak
  • С++20 Сoroutines та огляд бібліотек, які реалізують підтримку со-програм

    * і коли ця лямбда має непустий список кепчурів. Інакше лямбда-корутини норм.

    Та ніби ні в чому. Просто за потенційно небезпечними поганими практиками зазвичай більше слідкують статичні аналізатори, ніж компілятори. Хоча я не проти, щоб і компілятор на таке кидав ворнінг.

    Підтримав: Denys Poltorak
  • С++20 Сoroutines та огляд бібліотек, які реалізують підтримку со-програм

    C++ заявлено як мову, котра безпечніша за С.

    Ще Страуструп писав: «In C++ it’s harder to shoot yourself in the foot, but when you do, you blow off your whole leg». Це той випадок.

    Усі постріли в ноги — від необачності.

    Ну так це теж необачність. Людина забула, що написання лямбди з кепчуром — це те саме, що створення класу з відповідним полем. І якщо нестатичний метод класу зробити корутиною, така корутина може пережити сам об’єкт і звертання до полів буде робити use after free.

    Для цього є compiler warnings.

    Ворнінги таке навряд чи ловитимуть, а от від статичних аналізаторів типу cppcheck я б в майбутньому такого очікував.

  • С++20 Сoroutines та огляд бібліотек, які реалізують підтримку со-програм

    Я пояснив, чому на мою думку це не баг, а фіча. Просто її потрібно занести в категорію поганих практик і не користуватись unless є дуже серйозні причини для зворотнього (в цьому конкретному випадку не можу знайти жодної).

  • С++20 Сoroutines та огляд бібліотек, які реалізують підтримку со-програм

    Так, це граблі, але вони дуже логічні, якщо згадати, що таке лямбди в C++ по своїй суті.
    Лямбда — це спосіб швидко згенерувати клас з перевантаженим оператором `()` і створити його інстанс.

    Замініть в цьому прикладі `operator()` на будь-яку іншу нестатичну мембер-функцію (точніше, нестатичну мембер-корутину) — і отримаєте більш загальну форму цих граблей: нестатичні мембер-функції, що є корутинами, штука стрьомна. Адже об’єкт `*this` може померти, коли корутину хтось ще збирається резьюмити.

  • 10 переваг мови С++, яка і досі залишається актуальною

    Теж працюю зараз на проекті, якому більше 20 років. Перейшли на 17 стандарт пару років назад, політ нормальний.
    Переходили, бо нові фішечки роблять деякі етапи розробки зручнішими.
    Плюс складність — в деякому сенсі так, але не такий страшний аваков, як його малюють. Плюс я завжди на зв’язку і з задоволенням поясню, що незрозуміло (я в команді щось типу «фаната C++» і «експерта», періодично консультую колег, у кого виникають питання).

  • 10 переваг мови С++, яка і досі залишається актуальною

    Ні, то я заснув обличчям на клавіатурі, перепрошую.

  • 10 переваг мови С++, яка і досі залишається актуальною

    А ще там можна перевантажити оператор , (кома).
    Це взагалі весело.

    Якось на одній конференції Стефан Лававей — майкрософтівський чєл, відповідальний за їх реалізацію стандартної бібліотеки — показував приклад з циклом for у реалізації якогось generic алгоритму, де в третій частині інкрементилися два ітератори:

    for (...; ...; ++iterator1, (void)+++iterator2)

    Питає у аудиторії: «як думаєте, нафіга там каст до void?»
    Не вгадав ніхто.

    Відповідь: тому що клієнтський код міг оверлоадити оператор «кома» для своїх ітераторів xD

  • Як почуваються ЛГБТК+ люди в українському ІТ та геймдеві. 40% приховують свою орієнтацію

    Їхало збочення через збочення,
    Бачить збочення: в збоченні збочення.
    Збочення, збочення, збочення, збочення,
    Збочення, збочення, збочення, збочення.

    Згоден, давайте не будемо вирішувати проблему певної категорії людей, яка стала набагато гострішою під час війни, просто тому, що я вважаю їх спосіб життя збоченням. Інших аргументів у мене немає, але вже цього має бути достатньо.

    Мені наплювати, що велика їх частина зараз також на фронті або волонтерить. Набагато більша, ніж здається, тому що якщо навіть в нашій ламповій айтішечці багато людей бояться про себе говорити через дискримінацію, то що вже говорити про армію.

    Хай їх (де-факто) дружин/чоловіків не пускають до них в лікарню у випадку важкого поранення. Хай їх спадок у випадку смерті дістається яким-небудь далеким родичам замість справді близьких людей. Все заради того, щоб я міг далі жити комфортно зі своїми упередженнями. Я зовсім не моральний збоченець.

    Підтримав: Artem Kolosok
  • Про фейкових інженерів, або Чому я недолюблюю Stack Overflow Driven Development

    really are

    У каждого своё «really».

  • Про фейкових інженерів, або Чому я недолюблюю Stack Overflow Driven Development

    Не верю в существование «Stack Overflow-driven development». В реальности крайне редко встречаются задачи, решение которых от начала до конца будет присутствовать на stackoverflow. Разве что если компания постоянно занимается рутинным "формошлёпством"/"крудошлёпством"/etc.

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

  • Java, C++ qsort, countsort Можно ли сделать код еще быстрее?

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

    Да и во всех мейнстримных реализациях стандартной библиотеки std::swap отмечен inline (constexpr с 20 стандарта, что также подразумевает inline для функций).

    Так что не вижу смысла здесь имплементить свой свап.

  • Java, C++ qsort, countsort Можно ли сделать код еще быстрее?

    Ну, це коли мова йде про використання об’єктів зі стандартними контейнерами. Не з усіма об’єктами їх використовують.

    Але так, хороше правило by default: позначати move constructor і move assignment operator як noexcept, коли це можливо.

    Щодо інших функцій — питання неоднозначне.
    З одного боку, це непогано документує код для інших девелоперів, а також дозволяє темплейтному коду приймати рішення на підставі того, чи гарантує певний виклик 100% відсутність ексепшенів (подібно тому, як це робить std::vector при релокації своїх елементів).
    З іншого — сама функція може стати повільнішою через вимогу стандарту детектити порушення «контракту» і викликати terminate.

  • Java, C++ qsort, countsort Можно ли сделать код еще быстрее?

    Ну, конкретно в языке C++, его всяких правилах, фичах и т.д. меня может и можно назвать «экспертом». Но в алгоритмах я не так силён. Так что, увы, с ними лучше обратиться к кому-то другому.

  • Java, C++ qsort, countsort Можно ли сделать код еще быстрее?

    Смотреть видео у меня сейчас времени нет. Да и с имплементацией алгоритмов сортировки я игрался уж очень давно (в продакшене всегда юзал готовые из стандартной библиотеки) — поэтому с алгоритмической частью сейчас помочь вряд ли смогу.
    Но если есть конкретные вопросы по тому, как работают отдельные вещи в C++, — могу ответить на них.

    А лучше постить код прямо в эту тему. Здесь много знающих людей, мб кому-то из них будет не лень углубиться в алгоритм более серьёзно и помочь конкретно с ним.

  • Java, C++ qsort, countsort Можно ли сделать код еще быстрее?

    Чи мається на увазі, що сама операція «=» має щось повернути? Тоді від цього маразму давно треба було позбутися — через його непередбачуваність людською логікою.

    Для плюсовиків (і сішників) все норм, ми давно звикли до цієї поведінки. Жодного разу в продакшені не бачив, щоб вона призводила до якихось страшних наслідків. Хіба що під час написання лабораторок в універі, коли студенти ще не знають мову на достатньому рівні.

    Підтримав: Oleksandr Golovatyi
  • Java, C++ qsort, countsort Можно ли сделать код еще быстрее?

    А построение логики приложения на эксепшинах считается просто гигантской индусятиной.

    Крайности.
    Как минимум, не performance-critical код на эксепшенах имеет ряд своих преимуществ (читабельность, отделение «нормального» воркфлоу от хендлинга ошибок в коде, всё такое). Не удалось открыть соединение с БД или подключиться куда-то по сети — кинули эксепшен. Это нормально.
    Что касается низкоуровневых алгоритмов вроде той же сортировки — там да, эксепшены вряд ли привнесут что-то хорошее.

  • Как зарегистрировать предпринимателя в Грузии: зачем подключать местную мобильную связь и оформлять онлайн-банкинг

  • Java, C++ qsort, countsort Можно ли сделать код еще быстрее?

    arr[i] = val — это то же самое, что *(arr + i) = val.
    Во втором случае происходит array-to-pointer decay во время операции +: массив кастится к указателю на свой первый элемент (int[N] -> int*), и дальше к этому указателю добавляется сдвиг i. Затем оператор * разыменовывает получившийся указатель, получая как бы ссылку на i-тый элемент массива. И по этой ссылке присваивает значение val. Результат получается идентичным.

    *arr + i = val не скомпилится.
    Инструкция *arr здесь будет разыменованием указателя (опять же, массив неявно скастится к int*). Следовательно, инструкция *arr вернёт тебе ссылку (не указатель) на самый первый элемент массива. Затем уже к этому элементу добавится значение i. Это произведёт временный объект типа int, имеющий значение arr[0]+i.
    Присваивать что-либо временным объектам встроенных типов нельзя: «error: lvalue required as left operand of assignment».

  • Java, C++ qsort, countsort Можно ли сделать код еще быстрее?

    Если эксепшн бросается прям реально редко, когда прям реально что-то пошло очень сильно не так, — его использование может и не помешать перформансу. А может даже помочь, ибо из «hot path» уберётся лишняя проверка (хотя тут тоже надо профайлить).

    Но бросать эксепшн, если «-1» это реально ожидаемый результат во многих случаях (часть «обычного» воркфлоу, а не «exceptional»), действительно не стоит.

    Підтримали: Jan Haring, Valentin Nechayev
← Сtrl 123456...63 Ctrl →