Создаем эмулятор Sega Mega Drive на C++
В этой статье описано создание эмулятора 16-битной приставки Sega Mega Drive на C++.
Будет много интересного: эмуляция процессора Motorola 68000, реверсинг игр, графика на OpenGL, шейдеры, и многое другое. И все это на современном C++. В статье много картинок, можно хоть на них посмотреть.
https://habr.com/ru/articles/871284/
#cpp #programming
👉 @cpp_lib
В этой статье описано создание эмулятора 16-битной приставки Sega Mega Drive на C++.
Будет много интересного: эмуляция процессора Motorola 68000, реверсинг игр, графика на OpenGL, шейдеры, и многое другое. И все это на современном C++. В статье много картинок, можно хоть на них посмотреть.
https://habr.com/ru/articles/871284/
#cpp #programming
👉 @cpp_lib
Приглашаем на встречу РГ21 по C++
Приходите обсудить новости последней встречи международного комитета по стандартизации языка. Ещё в программе — ответы на ваши вопросы о стандарте С++ и афтерпати.
Встречу проведёт Антон Полухин, руководитель группы разработки общих компонентов Техплатформы городских сервисов Яндекса.
Москва, онлайн и офлайн 25 марта.
Регистрируйтесь.
Приходите обсудить новости последней встречи международного комитета по стандартизации языка. Ещё в программе — ответы на ваши вопросы о стандарте С++ и афтерпати.
Встречу проведёт Антон Полухин, руководитель группы разработки общих компонентов Техплатформы городских сервисов Яндекса.
Москва, онлайн и офлайн 25 марта.
Регистрируйтесь.
📌 Оптимизация использования
Сегодня я расскажу вам, как оптимизировать работу
🔥 1. Выбирайте правильный хеш-функтор
По умолчанию
Пример кастомного хеша для структуры:
Используем
⚡ 2. Контролируйте размер bucket'ов
Если
Это ускорит вставку, так как уменьшит количество перераспределений памяти.
🚀 3. Избегайте ненужного копирования ключей
Если ключ — это сложный объект, избегайте его копирования:
Еще лучше использовать
🏆 Вывод
✅ Используйте кастомные хеш-функции, если ключи нестандартные
✅ Резервируйте память заранее (
✅ Уменьшайте копирование ключей, используя
А вы используете
#cpp #programming
👉 @cpp_lib
std::unordered_map
в C++ Сегодня я расскажу вам, как оптимизировать работу
std::unordered_map
и избежать неожиданных тормозов. std::unordered_map
— мощная хеш-таблица в C++, но при неправильном использовании она может замедлить ваш код. Давайте разберем основные моменты, которые помогут избежать проблем. 🔥 1. Выбирайте правильный хеш-функтор
По умолчанию
std::unordered_map
использует std::hash<Key>
, но если ключ — это пользовательский тип данных (например, struct`), то стандартного `std::hash
не существует, и придется писать свой. Пример кастомного хеша для структуры:
struct MyKey {
int x, y;
bool operator==(const MyKey& other) const {
return x == other.x && y == other.y;
}
};
struct MyHash {
size_t operator()(const MyKey& key) const {
return std::hash<int>{}(key.x) ^ (std::hash<int>{}(key.y) << 1);
}
};
std::unordered_map<MyKey, std::string, MyHash> my_map;
Используем
^
(XOR) и <<
(битовый сдвиг), чтобы уменьшить коллизии.⚡ 2. Контролируйте размер bucket'ов
Если
std::unordered_map
сильно увеличивается, он перехеширует (rehash), что может быть дорогой операцией. Чтобы избежать лишних перераспределений:
my_map.reserve(10000); // Подготавливаем место под 10,000 элементов
Это ускорит вставку, так как уменьшит количество перераспределений памяти.
🚀 3. Избегайте ненужного копирования ключей
Если ключ — это сложный объект, избегайте его копирования:
std::unordered_map<std::string, int> data;
std::string key = "long_key_string";
int value = data[key]; // ❌ НЕ ЭФФЕКТИВНО: создаст пустую запись, если ключа нет
int value = data.at(key); // ✅ БЫСТРЕЕ: выбросит исключение, если ключа нет
Еще лучше использовать
find()
:
auto it = data.find(key);
if (it != data.end()) {
int value = it->second;
}
🏆 Вывод
✅ Используйте кастомные хеш-функции, если ключи нестандартные
✅ Резервируйте память заранее (
reserve
) ✅ Уменьшайте копирование ключей, используя
find()
и at()
А вы используете
std::unordered_map
в своих проектах? Может, у вас есть свои фишки? Пишите в комментариях! 👇🚀#cpp #programming
👉 @cpp_lib
Media is too big
VIEW IN TELEGRAM
Сборка C++ проектов. Пакетный менеджер CONAN. Game Engine серии
0:00:00 - Введение
0:02:43 - Conan. Теория
0:07:31 - Conan. Установка
0:10:44 - Conan. Базовая настройка
0:17:04 - ConanCenter. JSON
0:34:46 - GTest
0:54:43 - Chuck Norris API, cpr
1:15:19 - Автоматизация сборок
источник
#cpp #programming
👉 @cpp_lib
0:00:00 - Введение
0:02:43 - Conan. Теория
0:07:31 - Conan. Установка
0:10:44 - Conan. Базовая настройка
0:17:04 - ConanCenter. JSON
0:34:46 - GTest
0:54:43 - Chuck Norris API, cpr
1:15:19 - Автоматизация сборок
источник
#cpp #programming
👉 @cpp_lib
Повышение квалификации на курсе «C++ Developer. Professional» — ваш ключ к тому, чтобы прокачать навыки и стать востребованным разработчиком.
Что вас ждёт:
— Работа с новыми стандартами C++20 и C++23.
— 14 практических работ для портфолио.
— Освоение многопоточного программирования, сетей и работы с данными.
— Понимание паттернов проектирования и тонкостей языка.
Почему выбирают нас?
— Преподаватели — опытные эксперты из ведущих IT-компаний.
— Живые лекции, поддержка на каждом этапе обучения.
— Диплом OTUS, который ценят работодатели.
🎫 Курс можно приобрести в рассрочку
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Получите оффер в YADRO всего за 3 дня! 🚀
Компания-лидер инженерной индустрии в России YADRO приглашает C++ Software Engineer на SPRINT OFFER.
Команда Телеком ждёт кандидатов сразу в два направления: Telecom Platform и Разработка базовых станций с поддержкой LTE/GSM и 5G Core.
Если вам интересно принять участие в разработке первых российский базовых станций стандартов GSM/LTE — присоединяйтесь к команде Телеком. Вы будете с нуля создавать решения для беспроводных мобильных сетей и сопутствующих услуг: от исследований и прототипирования до вывода в коммерческое использование.
Большую часть кода разработчики пишут на C++. В зависимости от компонента применяют как последние «фишки» С++20, так и занимаются низкоуровневой оптимизацией кода для повышения производительности.
🔵 Читайте подробности на сайте и оставляйте заявку до 9 марта → по ссылке.
Присоединяйтесь к проекту, где сможете создавать системы, которыми будут пользоваться сотни тысяч людей!
Компания-лидер инженерной индустрии в России YADRO приглашает C++ Software Engineer на SPRINT OFFER.
Команда Телеком ждёт кандидатов сразу в два направления: Telecom Platform и Разработка базовых станций с поддержкой LTE/GSM и 5G Core.
Если вам интересно принять участие в разработке первых российский базовых станций стандартов GSM/LTE — присоединяйтесь к команде Телеком. Вы будете с нуля создавать решения для беспроводных мобильных сетей и сопутствующих услуг: от исследований и прототипирования до вывода в коммерческое использование.
Большую часть кода разработчики пишут на C++. В зависимости от компонента применяют как последние «фишки» С++20, так и занимаются низкоуровневой оптимизацией кода для повышения производительности.
Присоединяйтесь к проекту, где сможете создавать системы, которыми будут пользоваться сотни тысяч людей!
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Оптимизация кода в C++: Используем
Привет, друзья! Сегодня я расскажу об одной из самых частых ошибок, связанных с
❌ Ошибка: Бессмысленный
Что здесь не так? Возвращаемый
✅ Правильный вариант:
🏆 Где
Используйте
⚡ Советы:
1️⃣ Не используйте
2️⃣ Используйте
3️⃣ После
#cpp #programming
👉 @cpp_lib
std::move
правильно! Привет, друзья! Сегодня я расскажу об одной из самых частых ошибок, связанных с
std::move
. Многие знают, что std::move
не перемещает объект, а лишь превращает его в rvalue. Но как его использовать правильно? Давайте разбираться! ❌ Ошибка: Бессмысленный
std::move
std::string getString() {
std::string str = "Hello, world!";
return std::move(str); // ❌ Неэффективно
}
Что здесь не так? Возвращаемый
std::string
и так является временным объектом (NRVO — оптимизация возврата), и std::move
мешает этой оптимизации! В результате компилятор не сможет выполнить перемещение, а вызовет копирование. ✅ Правильный вариант:
std::string getString() {
return "Hello, world!"; // ✅ NRVO оптимизация
}
🏆 Где
std::move
полезен?Используйте
std::move
, когда точно знаете, что объект больше не нужен и его можно переместить:
void processString(std::string str) { /* ... */ }
int main() {
std::string s = "Example";
processString(std::move(s)); // 🔥 Теперь перемещение!
}
⚡ Советы:
1️⃣ Не используйте
std::move
при возврате локальных объектов — дайте компилятору сделать свое дело! 2️⃣ Используйте
std::move
, когда объект больше не нужен — это ускорит работу кода. 3️⃣ После
std::move
не используйте переменную, кроме как для присвоения нового значения. #cpp #programming
👉 @cpp_lib
🚀Это отличный ресурс для программистов, работающих с C++. Можно найти подробную документацию по стандартной библиотеке, STL, различным версиям стандарта C++, а также примеры кода и объяснения по ключевым аспектам языка.
Справочник по C++
C++11, C++14, C++17, C++20, C++23, C++26 │ Поддержка компиляторами C++11, C++14, C++17, C++20, C++23, C++26
Справочник по языку C
C89, C95, C99, C11, C17, C23 │ Поддержка компиляторами C99, C23
https://ru.cppreference.com/w/
#cpp #programming
👉 @cpp_lib
Справочник по C++
C++11, C++14, C++17, C++20, C++23, C++26 │ Поддержка компиляторами C++11, C++14, C++17, C++20, C++23, C++26
Справочник по языку C
C89, C95, C99, C11, C17, C23 │ Поддержка компиляторами C99, C23
https://ru.cppreference.com/w/
#cpp #programming
👉 @cpp_lib
C++ — мощный инструмент, но с ним нужно правильно работать
Хотите писать на C++, но настройка окружения кажется головной болью?
◽️ Компилятор не видит файлы?
◽️Дебаг работает через раз?
◽️VSCode — просто красивый редактор?
💡 Приходите на открытый вебинар «Готовим рабочее место: C++ + VSCode»!
📅 5 марта в 20:00 (мск)
Мы разберём:
◽️Как настроить VSCode для C++: компиляторы, расширения, дебаг
◽️Как запускать программы без ошибок и ручной магии
◽️Как сделать среду разработки удобной и эффективной
🎯 А ещё всем участникам подарим скидку на топовый курс «C++ Developer»!
🔗 Регистрация: https://vk.cc/cIZCSZ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Хотите писать на C++, но настройка окружения кажется головной болью?
◽️ Компилятор не видит файлы?
◽️Дебаг работает через раз?
◽️VSCode — просто красивый редактор?
💡 Приходите на открытый вебинар «Готовим рабочее место: C++ + VSCode»!
📅 5 марта в 20:00 (мск)
Мы разберём:
◽️Как настроить VSCode для C++: компиляторы, расширения, дебаг
◽️Как запускать программы без ошибок и ручной магии
◽️Как сделать среду разработки удобной и эффективной
🎯 А ещё всем участникам подарим скидку на топовый курс «C++ Developer»!
🔗 Регистрация: https://vk.cc/cIZCSZ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Media is too big
VIEW IN TELEGRAM
С++ и безопасность: правда ли все так плохо?
Сергей проанализировал недавний отчет NSA и рассказал, так ли плохо обстоят дела с безопасностью в С++ на самом деле и что современная индустрия предлагает для решения этого вопроса.
Он разобрал проблемы с безопасностью в С++ на открытых примерах из Chromium, среди которых:
— работа с памятью;
— UB;
— C legacy, строки, арифметика, преобразования типов.
Спикер также показал различные подходы к митигации описанных проблем, в частности:
— статический анализ;
— динамический анализ;
— фаззинг-тестирование;
— харденинг;
— выделение безопасных подмножеств языка: Misra, AUTOSAR, стандарт Google;
— методология SDL как комплексное решение;
— (бонус) подход KasperskyOS по определению недоверенных компонентов, допускающих наличие уязвимостей, но без возможности их проэксплуатировать и развить атаку.
источник
#cpp #programming
👉 @cpp_lib
Сергей проанализировал недавний отчет NSA и рассказал, так ли плохо обстоят дела с безопасностью в С++ на самом деле и что современная индустрия предлагает для решения этого вопроса.
Он разобрал проблемы с безопасностью в С++ на открытых примерах из Chromium, среди которых:
— работа с памятью;
— UB;
— C legacy, строки, арифметика, преобразования типов.
Спикер также показал различные подходы к митигации описанных проблем, в частности:
— статический анализ;
— динамический анализ;
— фаззинг-тестирование;
— харденинг;
— выделение безопасных подмножеств языка: Misra, AUTOSAR, стандарт Google;
— методология SDL как комплексное решение;
— (бонус) подход KasperskyOS по определению недоверенных компонентов, допускающих наличие уязвимостей, но без возможности их проэксплуатировать и развить атаку.
источник
#cpp #programming
👉 @cpp_lib
Botan — это мощная криптографическая библиотека на C++, поддерживающая широкий спектр алгоритмов и предназначенная для использования в различных проектах. Она отличается модульной архитектурой, хорошей производительностью и кроссплатформенностью.
Основные возможности:
🔹 Поддержка симметричных и асимметричных алгоритмов шифрования
🔹 Генерация и управление ключами
🔹 Хеш-функции и HMAC
🔹 Поддержка TLS и сертификатов X.509
🔹 Стандартизованные и экспериментальные криптографические примитивы
Библиотека активно развивается и используется в различных областях, включая безопасность сетевых соединений, шифрование данных и аутентификацию.
https://github.com/randombit/botan
#cpp #programming
👉 @cpp_lib
Основные возможности:
🔹 Поддержка симметричных и асимметричных алгоритмов шифрования
🔹 Генерация и управление ключами
🔹 Хеш-функции и HMAC
🔹 Поддержка TLS и сертификатов X.509
🔹 Стандартизованные и экспериментальные криптографические примитивы
Библиотека активно развивается и используется в различных областях, включая безопасность сетевых соединений, шифрование данных и аутентификацию.
https://github.com/randombit/botan
#cpp #programming
👉 @cpp_lib
Game++. Building arcs
Прежде чем рассказать про архитектуры игровых движков, я подумал, что будет полезно немного рассказать о том, как я понимаю архитектуру ПО и как это связано с играми. Во-первых они (архитектуры) есть, чтобы бы там не врали про игрострой. Во-вторых их оказывается больше одной. Это, возможно, поможет вам понять, почему остальные статьи написаны в таком порядке, или без какого-то порядка. В худшем случае, когда вас втянут в спор о том, насколько отвратительны (или, наоборот, потрясающе гениальны) отдельные игровые движки и их архитектуры, у вас будет пара аргументов и понимание что к чему.
Символично, что статья про архитектуру игрового движка появилась после того, как было рассказано про строки, мультипоток, применение алгоритмов: просто оно так и в жизни получается, мы сначала пишем код, редактор, игру - костяк проекта обрастает мясом, и тут нас догоняют проблемы, на которые все забивали, потому что надо было выдать хоть что-то похожее на работающий вариант. Но от того, что мы забивали на проблемы и заметали их под коврик беклога, проблемами быть они не перестали.
Вы не получите из статьи знаний об аллокаторах, контейнерах, или математике, стоящей за физикой игры. Так же я не ставлю целью научить вас, как применять A* разбиение в поиске пути неписей или моделировать реверберацию комнаты. Вместо этого есть размышления о коде между всем этим. И даже не столько про написание кода, сколько о его организации.
https://habr.com/ru/articles/885780/
#cpp #programming
👉 @cpp_lib
Прежде чем рассказать про архитектуры игровых движков, я подумал, что будет полезно немного рассказать о том, как я понимаю архитектуру ПО и как это связано с играми. Во-первых они (архитектуры) есть, чтобы бы там не врали про игрострой. Во-вторых их оказывается больше одной. Это, возможно, поможет вам понять, почему остальные статьи написаны в таком порядке, или без какого-то порядка. В худшем случае, когда вас втянут в спор о том, насколько отвратительны (или, наоборот, потрясающе гениальны) отдельные игровые движки и их архитектуры, у вас будет пара аргументов и понимание что к чему.
Символично, что статья про архитектуру игрового движка появилась после того, как было рассказано про строки, мультипоток, применение алгоритмов: просто оно так и в жизни получается, мы сначала пишем код, редактор, игру - костяк проекта обрастает мясом, и тут нас догоняют проблемы, на которые все забивали, потому что надо было выдать хоть что-то похожее на работающий вариант. Но от того, что мы забивали на проблемы и заметали их под коврик беклога, проблемами быть они не перестали.
Вы не получите из статьи знаний об аллокаторах, контейнерах, или математике, стоящей за физикой игры. Так же я не ставлю целью научить вас, как применять A* разбиение в поиске пути неписей или моделировать реверберацию комнаты. Вместо этого есть размышления о коде между всем этим. И даже не столько про написание кода, сколько о его организации.
https://habr.com/ru/articles/885780/
#cpp #programming
👉 @cpp_lib
Алгоритмы манипуляций с битами
В статье приведены алгоритмы обработки коротких битовых строк, обычно вмещающихся в машинное слово, в большей степени эти алгоритмы предназначены для обработки строк длины 32 или 64, но многие из них можно применять для SIMD инструкций или даже GPU.
https://habr.com/ru/articles/886182/
#cpp #programming
👉 @cpp_lib
В статье приведены алгоритмы обработки коротких битовых строк, обычно вмещающихся в машинное слово, в большей степени эти алгоритмы предназначены для обработки строк длины 32 или 64, но многие из них можно применять для SIMD инструкций или даже GPU.
https://habr.com/ru/articles/886182/
#cpp #programming
👉 @cpp_lib
Media is too big
VIEW IN TELEGRAM
Плывущий экран. Вирус на C++. Melting Screen
Программа предоставлена в образовательных целях! Автор не несёт ответственности за её использование!
В этом видео вы узнаете как написать вирус на с++ который заставляет экран сыпаться и плыть.
источник
#cpp #programming
👉 @cpp_lib
Программа предоставлена в образовательных целях! Автор не несёт ответственности за её использование!
В этом видео вы узнаете как написать вирус на с++ который заставляет экран сыпаться и плыть.
источник
#cpp #programming
👉 @cpp_lib
📌 5 способов ускорить компиляцию C++ проекта
Всем доброго вечера, или утра✌️ Компиляция C++ — боль, особенно на больших проектах. Сегодня расскажу, как ускорить этот процесс.
🚀 1. Используйте
🔹
🔹 Установка (Linux/macOS):
🔹 Использование:
⚡ 2. Включите
🔹 Используйте
🔹 Это позволяет компилятору использовать несколько ядер процессора.
🔥 3. Используйте
🔹 Если у вас много инклудов в
🔹 Теперь подключайте
💨 4. Разделяйте сборку на модули
🔹 Используйте
🔹 Или попробуйте C++ модули (`export module`) в новых компиляторах.
🏎️ 5. Собирайте в
🔹 Используйте
🔹 Для дебага —
Как вы ускоряете сборку? Пишите в комментариях! 🚀
#cpp #programming
👉 @cpp_lib
Всем доброго вечера, или утра
🚀 1. Используйте
ccache
🔹
ccache
кеширует результаты компиляции и повторно использует их при неизменности исходного кода. 🔹 Установка (Linux/macOS):
sudo apt install ccache # для Ubuntu
brew install ccache # для macOS
🔹 Использование:
export CC="ccache g++"
export CXX="ccache g++"
⚡ 2. Включите
-j
в make
🔹 Используйте
make -jN
, где N
— количество потоков. Например:
make -j$(nproc) # на Linux
make -j$(sysctl -n hw.ncpu) # на macOS
🔹 Это позволяет компилятору использовать несколько ядер процессора.
🔥 3. Используйте
pch
(предкомпилированные заголовки) 🔹 Если у вас много инклудов в
.cpp
файлах, создайте pch
файл:
// stdafx.h
#include <iostream>
#include <vector>
#include <map>
g++ -o stdafx.pch stdafx.h
🔹 Теперь подключайте
stdafx.pch
вместо кучи инклудов.💨 4. Разделяйте сборку на модули
🔹 Используйте
Unity Build
(объединение нескольких .cpp
в один). 🔹 Или попробуйте C++ модули (`export module`) в новых компиляторах.
🏎️ 5. Собирайте в
Release
с оптимизациями 🔹 Используйте
-O2
или -O3
, если важна скорость. 🔹 Для дебага —
-Og
:
g++ -Og -g main.cpp -o main
Как вы ускоряете сборку? Пишите в комментариях! 🚀
#cpp #programming
👉 @cpp_lib
Please open Telegram to view this post
VIEW IN TELEGRAM
👩💻 C — это фундамент программирования, а не просто язык.
Если вы хотите работать с производительностью, встроенными системами и взаимодействием с ОС — пора его освоить
В OTUS в рамках онлайн-курса «Программист С» пройдут бесплатные вебинары для разработчиков, админов и IoT-специалистов:
📌 11 марта (вт) в 20:00 мск — открытый урок «Практический Си: Разрабатываем игру-викторину» научит вас работать с памятью, использовать стандартную библиотеку и создавать полноценные консольные приложения.
➡️ Регистрация: https://vk.cc/cJpRPx
📌 24 марта(пн) в 20:00 мск — открытый урок «Язык и алгоритмы: Увлекательное путешествие в лексический анализ на C».
Разработаем простое приложение для лексического анализа простейшего языка программирования на языке С и рассмотрим:
-Основные алгоритмы и технологии создания приложений для лексического анализа.
-Области применения лексического анализа и особенности реализации.
-Поиск и определение ошибок в тексте.
➡️ Регистрация: https://vk.cc/cJpRPx
Не упустите возможность протестировать курс и познакомиться с экспертами. Полный курс можно будет оплатить любым удобным для вас способом. Для участия нужно пройти тест на странице с описанием курса.
Если вы хотите работать с производительностью, встроенными системами и взаимодействием с ОС — пора его освоить
В OTUS в рамках онлайн-курса «Программист С» пройдут бесплатные вебинары для разработчиков, админов и IoT-специалистов:
Разработаем простое приложение для лексического анализа простейшего языка программирования на языке С и рассмотрим:
-Основные алгоритмы и технологии создания приложений для лексического анализа.
-Области применения лексического анализа и особенности реализации.
-Поиск и определение ошибок в тексте.
Не упустите возможность протестировать курс и познакомиться с экспертами. Полный курс можно будет оплатить любым удобным для вас способом. Для участия нужно пройти тест на странице с описанием курса.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Улучшенные версии STL-контейнеров из библиотеки Boost
Илья Мещерин
В любом учебном курсе по C++, даже начального уровня, обязательно изучают, как устроен
При этом в библиотеке Boost давным-давно есть альтернативные версии контейнеров, которые выигрывают у стандартных по многим показателям. Однако об этих версиях почти никто не знает, о них почти нет лекций, статей и докладов. Пора положить этому конец и разобраться в том, как еще могут быть устроены контейнеры, помимо тех версий из STL, о которых и так все знают.
Спикер обсудил внутреннее устройство не таких уж стандартных контейнеров:
источник
#cpp #programming
👉 @cpp_lib
Илья Мещерин
В любом учебном курсе по C++, даже начального уровня, обязательно изучают, как устроен
std::vector
. Детали внутреннего устройства std::vector в подробностях продолжают изучать в вузах, спрашивать на собеседованиях, обсуждать на конференциях. То же самое происходит с контейнерами std::list
, std::deque
, std::map
и std::unordered_map: про их реализацию и особенности внутреннего устройства можно говорить бесконечно долго, про них все еще делают доклады, снимают лекции и пишут статьи. И их продолжают использовать в продакшен-коде даже в самых крупных и известных компаниях.При этом в библиотеке Boost давным-давно есть альтернативные версии контейнеров, которые выигрывают у стандартных по многим показателям. Однако об этих версиях почти никто не знает, о них почти нет лекций, статей и докладов. Пора положить этому конец и разобраться в том, как еще могут быть устроены контейнеры, помимо тех версий из STL, о которых и так все знают.
Спикер обсудил внутреннее устройство не таких уж стандартных контейнеров:
stable_vector
, devector
, bimap
, circular_buffer
, а также интрузивных версий list
, map
, unordered_map
и их разновидностей.источник
#cpp #programming
👉 @cpp_lib
Не покупайте грузовик для похода за хлебом и другие принципы программирования
Мне недавно встретился код вывода количества FPS на экран, написанный начинающим программистом, и в этом коде был базовый класс, класс-потомок, виртуальные функции, конструктор с множеством параметров, variant. Код позволял выводить любое количество счетчиков FPS на экран разными шрифтами, но все, что было на самом деле нужно, это простая функция на 3 строки, считающая количество FPS и выводящая его на экран.
https://habr.com/ru/articles/888570/
#cpp #programming
👉 @cpp_lib
Мне недавно встретился код вывода количества FPS на экран, написанный начинающим программистом, и в этом коде был базовый класс, класс-потомок, виртуальные функции, конструктор с множеством параметров, variant. Код позволял выводить любое количество счетчиков FPS на экран разными шрифтами, но все, что было на самом деле нужно, это простая функция на 3 строки, считающая количество FPS и выводящая его на экран.
https://habr.com/ru/articles/888570/
#cpp #programming
👉 @cpp_lib
Лексический анализ — один из важнейших этапов обработки текста, без которого не обходятся компиляторы, интерпретаторы и даже системы NLP.
💻 На открытом уроке рассмотрим:
-Основные алгоритмы и технологии создания приложений для лексического анализа.
-Области применения лексического анализа и особенности реализации.
-Поиск и определение ошибок в тексте.
Создадим простое приложение и разберем алгоритмы, которые помогают анализировать код.
📌 Встречаемся 24 марта в 20:00 мск.
Регистрируйтесь и получите гарантированную скидку на курсе «Программист С»: https://vk.cc/cJBPrt
💻 На открытом уроке рассмотрим:
-Основные алгоритмы и технологии создания приложений для лексического анализа.
-Области применения лексического анализа и особенности реализации.
-Поиск и определение ошибок в тексте.
Создадим простое приложение и разберем алгоритмы, которые помогают анализировать код.
Регистрируйтесь и получите гарантированную скидку на курсе «Программист С»: https://vk.cc/cJBPrt
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Оптимизация кода на C++: Ранний возврат вместо вложенных условий
Привет, друзья! Сегодня хочу поговорить об одной важной технике, которая делает код чище и читабельнее — ранний возврат (early return). Часто встречаю код, который уходит в глубину вложенных
❌ Плохой пример: Вложенные условия
Здесь код уходит вглубь из-за множества вложенных
✅ Хороший пример: Ранний возврат
Теперь код сразу проверяет граничные условия и делает ранний возврат (
🎯 Вывод:
- Избегайте вложенных
- Используйте ранний возврат, чтобы код был линейным и понятным.
- Чем меньше уровней вложенности — тем легче отладка и сопровождение.
#cpp #programming
👉 @cpp_lib
Привет, друзья! Сегодня хочу поговорить об одной важной технике, которая делает код чище и читабельнее — ранний возврат (early return). Часто встречаю код, который уходит в глубину вложенных
if
, превращаясь в настоящий лабиринт. Давайте разберем, как этого избежать.❌ Плохой пример: Вложенные условия
void process(int value) {
if (value > 0) {
if (value % 2 == 0) {
if (value < 100) {
std::cout << "Обрабатываем " << value << std::endl;
} else {
std::cout << "Слишком большое число" << std::endl;
}
} else {
std::cout << "Нечетное число" << std::endl;
}
} else {
std::cout << "Отрицательное число" << std::endl;
}
}
Здесь код уходит вглубь из-за множества вложенных
if
, что делает его сложным для чтения. ✅ Хороший пример: Ранний возврат
void process(int value) {
if (value <= 0) {
std::cout << "Отрицательное число" << std::endl;
return;
}
if (value % 2 != 0) {
std::cout << "Нечетное число" << std::endl;
return;
}
if (value >= 100) {
std::cout << "Слишком большое число" << std::endl;
return;
}
std::cout << "Обрабатываем " << value << std::endl;
}
Теперь код сразу проверяет граничные условия и делает ранний возврат (
return
), если условия не выполнены. В итоге у нас получился плоский код, который проще читать и сопровождать. 🎯 Вывод:
- Избегайте вложенных
if
, если можно этого не делать.- Используйте ранний возврат, чтобы код был линейным и понятным.
- Чем меньше уровней вложенности — тем легче отладка и сопровождение.
#cpp #programming
👉 @cpp_lib