Перейти к содержимому
Технологии IT обновлён 26.12.2021

Библиотека C/C++ разработчика

Библиотека для C/C++ разработчиков: полезные материалы по языку и сопутствующим темам. Присоединяйтесь!

Публикации канала

💡 Для back() диапазону нужны совместимые типы begin и end У диапазона есть размер и произвольный доступ к элементам. Для вызова back() через std::ranges::view_interface требуется ещё одно свойство: begin() и end() должны возвращать одинаковый тип. Такой диапазон называется common_range. В разборе требований к диапазонам показана причина. back() получает последний элемент через шаг назад от end(). Конец диапазона может быть отдельным объектом-сигналом — sentinel, который такую операцию не поддерживает. Для диапазона с размером и произвольным доступом помогает адаптер: auto common = std::views::common(range); Он вычисляет конечный итератор как begin() + size(). При написании обобщённого кода проверяйте требования каждой операции. Для доступа к последнему элементу также нужен непустой диапазон. ➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии 🐸 Библиотека программиста

Открыть в Telegram

⚡ Только до 31 октября: покупайте один курс Proglib Academy и получайте второй в подарок! Что можно освоить? ⏬ ИИ для разработчиков — применение ИИ на разных этапах разработки: от работы с кодом до тестирования, ревью и организации рабочего процесса. ⏬ Разработка ИИ-агентов — создание собственных агентов с памятью, интеграциями и доступом к внешним инструментам. Научитесь не просто работать с нейросетями, а создавать решения, которые помогают автоматизировать реальные задачи 📍 Можно выбрать эту пару или сочетать любые другие курсы из каталога — под свои интересы и цели. 🎁 Один курс оплачиваете, второй получаете бесплатно. Акция длится до 31 октября. ✨ Прокачать скиллы по акции

Открыть в Telegram

⚙️ Вложенный make может отключить параллельную сборку Запускаете make -j8, а часть проекта собирается последовательно. Проверьте, как Makefile запускает сборку в подкаталогах. Обычный вызов make -C subdir может потерять доступ к общему механизму распределения задач — jobserver. В разборе рекурсивного make показано, как передать управление правильно: subproject: ; $(MAKE) -C subdir $(MAKE) использует тот же исполняемый файл и позволяет вложенной сборке участвовать в общем лимите параллельных задач. В однострочном рецепте команда отделяется от цели точкой с запятой. Если сборка плохо загружает процессор, найдите прямые вызовы make в рецептах. Замените их на $(MAKE) и проверьте предупреждения jobserver unavailable. Параллелизм задайте при запуске верхнего уровня. ➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии 🐸 Библиотека программиста

Открыть в Telegram

⚙️ Visual Studio находит закреплённую версию MSVC в другой установке IDE хочется обновить, а компилятор — оставить тот же, что используется в CI. Особенно если смена toolset требует отдельного прогона тестов и проверки зависимостей. Visual Studio 2026 умеет искать точно закреплённую версию MSVC Build Tools в других установках Visual Studio или самостоятельного Build Tools. В проекте можно указать: <PropertyGroup> <EnableVCToolsVersionDiscovery>true</EnableVCToolsVersionDiscovery> <VCToolsVersion>14.43.34604</VCToolsVersion> </PropertyGroup> Номер здесь — пример конкретной версии. Если нужного набора нет в текущей установке, Visual Studio проверит другие установки. Раньше поиск был ограничен ситуацией, когда подходящего toolset в текущей установке вообще не было. Это позволяет обновлять редактор и отладчик отдельно от перехода на новый компилятор. Настройка не скачивает отсутствующий набор инструментов. Нужная версия должна быть установлена, в том числе на машине CI. И для воспроизводимости одной фиксации MSVC мало: версии SDK, зависимостей и параметры сборки тоже нужно учитывать. 🔗 Как включить поиск закреплённого toolset #под_капотом 📍 Навигация: Вакансии • Задачи • Собесы

Открыть в Telegram

Динозавр держится за ВМ и снапшоты по расписанию, Археолог давно не помнит, что и где у него крутится, а Повелителю облаков уютно до первого кругленького счёта. Это три из десяти типов инфраструктуры в тесте от команды Deckhouse. Ответьте на 5 вопросов, узнайте свой тип и отправьте ссылку на результат команде. Посмотрим, совпадёт ли он у коллег. → Пройти тест и узнать свой тип

Открыть в Telegram

⚙️ MSVC 14.52 RC добавляет режим /std:c++23 без суффикса preview В релиз-кандидате MSVC Build Tools 14.52 режим C++23 выбирается так: cl /std:c++23 /EHsc main.cpp Прежнее написание /std:c++23preview пока работает как псевдоним, но помечено устаревающим и будет удалено в одном из следующих обновлений. Здесь легко смешать два статуса. Название режима языка больше не содержит preview, но сам набор инструментов 14.52 на момент анонса остаётся RC. Он доступен через Visual Studio 2026 Insiders; стабильный выпуск ожидается в ноябре. Есть и отдельная настройка для вычислений из cmath во время компиляции. Одного /std:c++23 недостаточно: поддержка по умолчанию выключена и включается флагом /Zc:cmath. cl /std:c++23 /Zc:cmath /EHsc main.cpp При обновлении проверьте проект на конкретной версии toolset. Выбор режима стандарта сам по себе не обещает поддержку любой возможности языка и библиотеки. 🔗 Что изменилось в MSVC 14.52 RC #под_капотом 📍 Навигация: Вакансии • Задачи • Собесы

Открыть в Telegram

📌 Один курс — хорошее вложение в себя. Два по той же цене — ещё лучше. В Proglib Academy действует акция: покупаешь один курс, а второй получаешь в подарок. Например, можно совместить два направления по работе с ИИ: 💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью. 💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений. 📍 Разница в цене — почти 50 тысяч рублей. Можно освоить больше, не выходя за рамки запланированного бюджета. А если тебе интереснее Python, алгоритмы, backend или DevOps — выбирай другую пару курсов из каталога. Акция действует до 31 октября включительно ⏳ ⏮️ Пора прокачать свой стек

Открыть в Telegram

⚙️ Корректное округление помогает математическим библиотекам выдавать одинаковые результаты Один алгоритм, одинаковые входные данные — а после смены платформы последние биты результата отличаются. Для sin, exp или log причина может быть в реализации математической библиотеки. Такие функции обычно вычисляют приближение. Разные алгоритмы, таблицы и способы уменьшения аргумента могут дать соседние представимые значения. Корректное округление ставит более строгое условие: результат должен совпасть с округлением точного математического значения в выбранный формат. При одинаковых входных данных, формате и режиме округления это определяет нужный результат. Авторы LLVM-libc объясняют, как сочетать такой подход со скоростью. Для обычных случаев используется быстрый расчёт; если точности недостаточно, чтобы уверенно выбрать сторону округления, нужен более точный путь. Это важно для численных расчётов, воспроизводимых тестов и систем, где небольшое расхождение со временем накапливается. Но корректно округлённая функция не делает всю программу детерминированной: порядок операций, параллельные вычисления и настройки компилятора тоже влияют на результат. 🔗 Как LLVM-libc работает с точностью и воспроизводимостью #под_капотом 📍 Навигация: Вакансии • Задачи • Собесы

Открыть в Telegram

💡 std::future отдаёт результат один раз, а shared_future позволяет разделить доступ Результат уже вычислен. Почему нельзя просто вызвать get() ещё раз? std::promise<int> promise; auto future = promise.get_future(); promise.set_value(42); int answer = future.get(); // future больше не содержит общего состояния std::future рассчитан на одного получателя. Его нельзя скопировать, зато можно переместить и передать право получить результат другому участку кода. После get() повторный вызов недопустим. Если получателей несколько, до получения результата можно вызвать share(): std::promise<int> promise; auto first = promise.get_future().share(); auto second = first; promise.set_value(42); std::cout << first.get() << second.get(); Копии shared_future обращаются к одному общему состоянию. Для обычного типа T его get() возвращает const T&, поэтому значение можно читать повторно без создания отдельной копии результата. Обратная сторона: извлечь move-only объект перемещением из такой константной ссылки не получится. А время жизни полученной ссылки связано с общим состоянием. Обещание доступности результата также не делает сам изменяемый объект потокобезопасным. 🔗 Разбор future и shared_future от Реймонда Чена #под_капотом 📍 Навигация: Вакансии • Задачи • Собесы

Открыть в Telegram

⚙️ CMake Tools 1.24 сохраняет локальные изменения отдельно от общих пресетов Выключили BUILD_TESTING в редакторе кеша, снова запустили configure — и тесты вернулись. Так бывает, когда значение приходит из пресета: при следующей конфигурации он снова задаёт свой параметр. В CMake Tools 1.24 изменения переменных, заданных пресетом, можно сохранить как пользовательские переопределения в CMakeUserPresets.json. Сценарий такой: — сконфигурировать проект с нужным пресетом; — открыть CMake: Edit CMake Cache (UI); — поменять BUILD_TESTING с ON на OFF и сохранить; — расширение создаст пользовательское переопределение и выполнит конфигурацию с ним. Общий CMakePresets.json останется прежним. В редакторе кеша колонка Source помогает увидеть, откуда пришло значение: из проектного или пользовательского пресета либо только из кеша. Есть граница: переменные, которые существуют лишь в кеше, автоматически в пользовательский пресет не переносятся. Так локальный эксперимент с настройками сборки не превращается в изменение пресета для всей команды. 🔗 Как работают переопределения в CMake Tools 1.24 #под_капотом 📍 Навигация: Вакансии • Задачи • Собесы

Открыть в Telegram

😎 Выбираешь один курс, второй получаешь бесплатно. Баг? Нет, акция! До 31 октября в Proglib Academy можно выбрать два курса и заплатить только за один. Например, можно совместить: 💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью. 💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений. Вместе курсы стоят 108 000 ₽, но по акции оба обойдутся в 59 000 ₽. Экономия — 49 000 ₽ 🔥 Интересуют Python и ИИ или алгоритмы и архитектура? Можно выбрать любые два курса из каталога. Акция действует до 31 октября включительно ⏳ ⏬ Собрать свой учебный билд

Открыть в Telegram

💡 Контракты C++26 не заменяют проверку входных данных Индекс должен попадать в границы вектора. В C++26 это требование можно записать прямо в объявлении функции: int get_value(const std::vector<int>& values, std::size_t index) pre(index < values.size()) { return values[index]; } Читатель заголовочного файла сразу видит условие вызова. Но наличие pre ещё не гарантирует, что программа остановится при неправильном индексе. У контрактов несколько вариантов выполнения: проверку можно проигнорировать, сообщить о нарушении и продолжить либо завершить программу. Доступные режимы и их выбор зависят от реализации. Если индекс пришёл из запроса пользователя, ожидаемую ошибку нужно обработать обычным кодом до вызова функции. Нельзя рассчитывать, что контракт обязательно вернёт клиенту понятный ответ или не допустит опасного доступа. Условия контрактов также не должны менять состояние программы: проверка может вообще не выполниться. C++26 ещё не финализирован. Для эксперимента из статьи нужны GCC 16 и специальные флаги поддержки контрактов. 🔗 Разбор pre, post и режимов проверки #под_капотом 📍 Навигация: Вакансии • Задачи • Собесы C++ Stories C++26 Contracts: Introduction to Preconditions and Postconditions In the article about Standard Library hardening, we looked at checks for invalid Standard Library container access and other broken preconditions. I mentioned that those requirements are expressed in terms of “contracts”. But what about our code? In this…

Открыть в Telegram

💡 popcount и bit_width считают разные вещи Для числа 8 двоичная запись — 1000. Единичный бит один, но для записи нужны четыре позиции. Поэтому std::popcount(8u) возвращает 1, а std::bit_width(8u) — 4. У семёрки 111 оба результата равны 3. Это случайное совпадение, которое легко скрывает ошибку при проверке только такого значения. Для нуля обе функции возвращают 0. popcount подходит для подсчёта установленных флагов, bit_width — для минимальной ширины двоичного представления ненулевого значения. Эти функции доступны с C++20 и работают с беззнаковыми целочисленными типами. Функции для работы с битами 📍 Навигация: Вакансии • Задачи • Собесы #под_капотом

Открыть в Telegram

💡 to_chars: число записано, а C-строка не готова std::to_chars пишет символы в переданный буфер и возвращает ptr сразу после результата. Завершающий нулевой символ он не добавляет. В тесте буфер заполнен X. После записи числа 123 в нём осталось 123XXXXX. Строку получили из диапазона [first, result.ptr), а не поиском первого нуля. Это важно, если дальше API ожидает C-строку. Сначала проверяйте result.ec. Если места мало, вернётся std::errc::value_too_large, а содержимое диапазона не определено. Не считайте его частично готовым результатом. Целочисленные перегрузки доступны с C++17. Оба сценария — достаточный и маленький буфер — реально проверены. Контракт to_chars 📍 Навигация: Вакансии • Задачи • Собесы #под_капотом

Открыть в Telegram

Forwarded From Типичный программист 🧑‍💻 Какие навыки помогают вам в разработке в 2026 году? Что вы чаще используете в работе? В каких задачах помогает ИИ, а где проще справиться самостоятельно? Мы решили собрать портрет современного разработчика — и приглашаем вас поделиться своим опытом. Расскажите, какие навыки вам пригодились и как вы используете ИИ. Если обходите его стороной, нам тоже интересно узнать почему. Опрос анонимный и займёт около 5 минут. Результаты опубликуем в общем большом исследовании. 👉 Пройти опрос

Открыть в Telegram

⚙️ mdspan: один буфер, две раскладки Шесть чисел можно представить матрицей 2×3 без копирования элементов. std::mdspan из C++23 связывает данные, размеры и способ преобразования индексов в смещение. Для буфера 10, 20, 30, 40, 50, 60 раскладка layout_right идёт по строкам, layout_left — по столбцам. В проверенном примере индекс [1,1] даёт соответственно 50 и 40. Запись через один вид меняет тот же буфер, который виден другому. Размеры и layout не управляют временем жизни данных. В этом примере обычный accessor работает с указателем на std::array, поэтому массив должен жить дольше представлений. Поддержку C++23 нужно проверить и у компилятора, и у стандартной библиотеки. Устройство mdspan в P0009 📍 Навигация: Вакансии • Задачи • Собесы #под_капотом

Открыть в Telegram

Forwarded From Библиотека программиста 👀 Как вы смотрите видео? Разбираете урок, слушаете интервью фоном или начинаете на телефоне, а продолжаете на большом экране? Хотим узнать, что делает просмотр удобным для вас. Вспомните последнее видео — ролик, урок, фильм или серию сериала — и расскажите о своём опыте. Если детали не запомнились, можно так и ответить. 🕰️ Опрос займёт около 3 минут. В результатах сможете сравнить свои привычки с ответами других участников. А разработчики и инженеры видеоплатформы расскажут, что происходит по ту сторону экрана, пока вы смотрите видео. 🔗 Поделиться опытом 🐸 Библиотека программиста

Открыть в Telegram

😭 Как не потратить недельный лимит AI-кодинга за три дня? Разберём на вебинаре, как тратить меньше на AI-агентов — без потери качества кода. 🔘 Поговорим о том: — когда дорогая модель действительно нужна, а когда хватит дешёвой; — сколько стоит один прогон и куда уходят токены; — какие задачи можно отдавать субагентам; — как настроить маршрутизацию моделей; — что проверять в AI-коде перед merge. ✏️ Покажем всё на конкретных цифрах и вживую: сравним расходы до и после. ⬇️ 17 сентября, 19:00 МСК ⬇️ 1,5 часа · бесплатно ⬇️ Арсений Харланов и Олег Лайок 💬 Пишите в комментариях, где упираетесь в лимиты и на что уходят деньги. Самые залайканные вопросы разберём на вебинаре. 🔗 Зарегистрироваться на вебинар⁠

Открыть в Telegram

🤪 Если бы можно было задать один вопрос про AI в разработке — что бы вы спросили? Как выбрать инструмент? Как работать с AI-агентами? Как проверять сгенерированный код? Или как вообще встроить нейросети в свой процесс? Собираем вопросы для вебинара. Самые залайканные разберём в первую очередь 🔥 Пишите, что действительно интересно ⬇️

Открыть в Telegram

🤩 Inline static в классах — забудь про .cpp Сколько раз ты забывал добавить определение static члена в .cpp, и компилятор радостно выдавал undefined reference? С C++17 можно просто добавить inline к static переменной класса, и всё работает. Особенно круто это для счётчиков, кешей и паттерна Registry. // До C++17 class Logger { public: static std::ofstream log_file; // объявление static int message_count; // объявление }; // В .cpp обязательно нужны определения: // std::ofstream Logger::log_file{"app.log"}; // int Logger::message_count = 0; // С C++17 class Logger { public: inline static std::ofstream log_file{"app.log"}; inline static int message_count = 0; inline static std::mutex log_mutex; static void log(const std::string& msg) { std::lock_guard lock(log_mutex); log_file << "[" << message_count++ << "] " << msg << '\n'; } }; // Никаких дополнительных файлов! ❗️Теперь весь класс может жить в заголовочном файле, что идеально для template классов и header-only библиотек. Инициализация происходит при первом использовании, потокобезопасно и предсказуемо. 🐸 Библиотека C/C++ разработчика #шаблонный_код

Открыть в Telegram

Комментарии

0

Комментарии пишут вошедшие — так видно, кто автор.

Войти

Комментариев пока нет

Будьте первым, кто расскажет о канале другим.

Пожаловаться на канал

Расскажите, что не так: модератор проверит канал и примет решение. Подпись не нужна, но почту можно оставить — тогда ответим.

Причина Что не так (необязательно) Почта для ответа (необязательно)
Открыть в Telegram