Полезные материалы по всему, что может быть полезно плюсовику/сишнику.
Game++. Building arcs
Прежде чем рассказать про архитектуры игровых движков, я подумал, что будет полезно немного рассказать о том, как я понимаю архитектуру ПО и как это связано с играми. Во-первых они (архитектуры) есть, чтобы бы там не врали про игрострой. Во-вторых их оказывается больше одной. Это, возможно, поможет вам понять, почему остальные статьи написаны в таком порядке, или без какого-то порядка. В худшем случае, когда вас втянут в спор о том, насколько отвратительны (или, наоборот, потрясающе гениальны) отдельные игровые движки и их архитектуры, у вас будет пара аргументов и понимание что к чему.
Символично, что статья про архитектуру игрового движка появилась после того, как было рассказано про строки, мультипоток, применение алгоритмов: просто оно так и в жизни получается, мы сначала пишем код, редактор, игру - костяк проекта обрастает мясом, и тут нас догоняют проблемы, на которые все забивали, потому что надо было выдать хоть что-то похожее на работающий вариант. Но от того, что мы забивали на проблемы и заметали их под коврик беклога, проблемами быть они не перестали.
Вы не получите из статьи знаний об аллокаторах, контейнерах, или математике, стоящей за физикой игры. Так же я не ставлю целью научить вас, как применять A* разбиение в поиске пути неписей или моделировать реверберацию комнаты. Вместо этого есть размышления о коде между всем этим. И даже не столько про написание кода, сколько о его организации.
https://habr.com/ru/articles/885780/
#cpp #programming
👉 @cpp_lib
С++ и безопасность: правда ли все так плохо?
Сергей проанализировал недавний отчет NSA и рассказал, так ли плохо обстоят дела с безопасностью в С++ на самом деле и что современная индустрия предлагает для решения этого вопроса.
Он разобрал проблемы с безопасностью в С++ на открытых примерах из Chromium, среди которых:
— работа с памятью;
— UB;
— C legacy, строки, арифметика, преобразования типов.
Спикер также показал различные подходы к митигации описанных проблем, в частности:
— статический анализ;
— динамический анализ;
— фаззинг-тестирование;
— харденинг;
— выделение безопасных подмножеств языка: Misra, AUTOSAR, стандарт Google;
— методология SDL как комплексное решение;
— (бонус) подход KasperskyOS по определению недоверенных компонентов, допускающих наличие уязвимостей, но без возможности их проэксплуатировать и развить атаку.
источник
#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
Получите оффер в YADRO всего за 3 дня! 🚀
Компания-лидер инженерной индустрии в России YADRO приглашает C++ Software Engineer на SPRINT OFFER.
Команда Телеком ждёт кандидатов сразу в два направления: Telecom Platform и Разработка базовых станций с поддержкой LTE/GSM и 5G Core.
Если вам интересно принять участие в разработке первых российский базовых станций стандартов GSM/LTE — присоединяйтесь к команде Телеком. Вы будете с нуля создавать решения для беспроводных мобильных сетей и сопутствующих услуг: от исследований и прототипирования до вывода в коммерческое использование.
Большую часть кода разработчики пишут на C++. В зависимости от компонента применяют как последние «фишки» С++20, так и занимаются низкоуровневой оптимизацией кода для повышения производительности.
🔵 Читайте подробности на сайте и оставляйте заявку до 9 марта → по ссылке.
Присоединяйтесь к проекту, где сможете создавать системы, которыми будут пользоваться сотни тысяч людей!
Сборка 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
📌 Оптимизация использования 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) и <<
(битовый сдвиг), чтобы уменьшить коллизии.std::unordered_map
сильно увеличивается, он перехеширует (rehash), что может быть дорогой операцией. Чтобы избежать лишних перераспределений:
my_map.reserve(10000); // Подготавливаем место под 10,000 элементов
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
в своих проектах? Может, у вас есть свои фишки? Пишите в комментариях! 👇🚀Создаем эмулятор Sega Mega Drive на C++
В этой статье описано создание эмулятора 16-битной приставки Sega Mega Drive на C++.
Будет много интересного: эмуляция процессора Motorola 68000, реверсинг игр, графика на OpenGL, шейдеры, и многое другое. И все это на современном C++. В статье много картинок, можно хоть на них посмотреть.
https://habr.com/ru/articles/871284/
#cpp #programming
👉 @cpp_lib
Ваш код тормозит под нагрузкой?
Не справляется с задачами параллельного вычисления?
💡 Приходите на открытый урок по многопоточному программированию C++!
▫️Вместе напишем многопоточную реализацию задачи подсчёта суммы чисел.
▫️Разберём примитивы синхронизации.
▫️Ускорим код с помощью стандартной библиотеки.
🎯 Вы начнёте осваивать многопоточное программирование и сделаете первый шаг к позициям middle+ в C++!
А ещё получите скидку на большое обучение «C++ Developer».
📅 Успейте записаться на открытый вебинар 25 февраля в 20:00 (мск)!
🔗 Регистрируйтесь прямо сейчас и узнайте, как эффективно управлять потоками в C++: https://vk.cc/cISn4e
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
📌 Оптимизация кода: std::string_view вместо std::string
Привет, друзья! Сегодня хочу рассказать про std::string_view — полезный инструмент, который может значительно ускорить работу с строками в C++. Многие из вас, вероятно, используют std::string, но не всегда это лучший выбор.
❓ Что такое std::string_view?
Это некопируемая, легковесная оболочка над строковыми данными. Она просто хранит указатель на начало строки и её длину, не создавая копии. Использование std::string_view вместо std::string позволяет избежать ненужных аллокаций памяти и ускорить код.
🔥 Пример использования:
#include <iostream>
#include <string_view>
void print(std::string_view str) { // Без лишнего копирования
std::cout << str << '\n';
}
int main() {
std::string s = "Hello, world!";
print(s); // Можно передавать std::string
print("Hi there"); // Можно передавать строковый литерал
}
std::string::substr
, который делает копию). std::string_view
ещё используется.std::string_view
вместо const std::string&
может ускорить работу с текстовыми данными и снизить нагрузку на аллокатор. Если не нужно изменять строку — это отличный выбор! std::string_view
в своих проектах? Делитесь в комментариях! ⬇️C++26 — встреча ISO в Хагенберге
В середине февраля в Хагенберге состоялась встреча международного комитета по стандартизации языка программирования C++.
В этот раз прорабатывались следующие большие темы:std::hive
Constexpr, ещё больше constexpr
Безопасность, контракты, hardening
, профили, UB
и std::launder
Relocate
#embed
https://habr.com/ru/companies/yandex/articles/882518/
#cpp #programming
👉 @cpp_lib
⚡️ В сети начали массово сливать курсы и книги известных онлайн школ по айти
Вот отсортированная база с тонной материала (постепенно пополняется):
БАЗА (4687 видео/книг):
(363 видео, 87 книги) — Python
(415 видео, 68 книги) — Frontend
(143 видео, 33 книги) — ИБ/Хакинг
(352 видео, 89 книги) — С/С++
(343 видео, 87 книги) — Java
(176 видео, 32 книги) — Git
(293 видео, 63 книги) — C#
(174 видео, 91 книги) — DevOps
(167 видео, 53 книги) — PHP
(227 видео, 83 книги) — SQL/БД
(163 видео, 29 книги) — Linux
(114 видео, 77 книги) — Сисадмин
(107 видео, 43 книги) — BA/SA
(181 видео, 32 книги) — Go
(167 видео, 43 книги) — Kotlin/Swift
(112 видео, 24 книги) — Flutter
(137 видео, 93 книги) — DS/ML
(113 видео, 82 книги) — GameDev
(183 видео, 37 книги) — Дизайн
(129 видео, 73 книги) — QA
(213 видео, 63 книги) — Rust
(121 видео, 24 книги) — 1С
(136 видео, 33 книги) — PM/HR
Скачивать ничего не нужно — все выложили в Telegram
🦾Хардкорный тест по языку С++🦾
📌Пройдите тест из 20 вопросов и проверьте, насколько вы готовы к обучению на углубленном курсе «C++ Developer. Professional» от OTUS.
Сможете сдать - пройдете на курс по спеццене!
💻 В программе курса — все актуальные инструменты, необходимые Middle разработчику на C++. Возможна рассрочка.
🎫 Курс можно приобрести в рассрочку
➡️ Пройти тест и забрать welcome-скидку: https://vk.cc/cIJY4K
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🔥 Как правильно сравнивать std::string
в C++?
Доброй ночи! Давайте разберём важную тему – сравнение std::string
в C++. Многие думают, что это просто (==
и всё), но есть нюансы! Давайте разберёмся.
✅ Способы сравнения строк
1️⃣ Оператор ==
Если вам нужно проверить точное совпадение строк:
std::string str1 = "hello";
std::string str2 = "hello";
if (str1 == str2) {
std::cout << "Строки равны!\n";
}
compare()
std::string str1 = "apple";
std::string str2 = "banana";
if (str1.compare(str2) < 0) {
std::cout << "apple идет перед banana\n";
}
compare()
возвращает: 0
, если строки равны < 0
, если str1
меньше str2
> 0
, если str1
больше str2
std::transform
:
#include <algorithm>
#include <cctype>
#include <string>
bool caseInsensitiveCompare(const std::string& a, const std::string& b) {
return std::equal(a.begin(), a.end(), b.begin(), b.end(),
[](char c1, char c2) { return std::tolower(c1) == std::tolower(c2); });
}
std::string str1 = "Hello";
std::string str2 = "hello";
if (caseInsensitiveCompare(str1, str2)) {
std::cout << "Строки равны без учета регистра!\n";
}
std::string text = "hello world";
std::string prefix = "hello";
if (text.rfind(prefix, 0) == 0) {
std::cout << "Строка начинается с 'hello'!\n";
}
rfind(prefix, 0) == 0
проверяет, что prefix
стоит в начале строки.==
для простого сравнения compare()
– если важно узнать порядок std::tolower()
rfind()
Грязные трюки C++ из userver и Boost
Привет, я Антон Полухин из Техплатформы Екома и Райдтеха Яндекса. Моя команда разрабатывает userver — современный опенсорсный асинхронный фреймворк с богатым набором абстракций для быстрого и комфортного создания микросервисов, сервисов и утилит на C++.
Когда мы пишем какой‑то код для userver и для таких сложных проектов, как Boost, периодически мы сталкиваемся с нестандартными проблемами. И эти нестандартные проблемы требуют нестандартных решений. Вот о таких решениях мы сегодня и поговорим.
А именно:
- Посмотрим, как работают исключения на платформе Linux x86, и сделаем с ними что‑то интересное.
- Залезем ещё глубже под капот исключений и сделаем их ещё быстрее.
- Сделаем висячую ссылку на невалидный объект, и всё будет хорошо.
- А под конец то, что все любим, — погрузимся в шаблонное метапрограммирование.
https://habr.com/ru/companies/yandex/articles/852244
#cpp #programming
👉 @cpp_lib
Botan — это мощная криптографическая библиотека на C++, поддерживающая широкий спектр алгоритмов и предназначенная для использования в различных проектах. Она отличается модульной архитектурой, хорошей производительностью и кроссплатформенностью.
Основные возможности:
🔹 Поддержка симметричных и асимметричных алгоритмов шифрования
🔹 Генерация и управление ключами
🔹 Хеш-функции и HMAC
🔹 Поддержка TLS и сертификатов X.509
🔹 Стандартизованные и экспериментальные криптографические примитивы
Библиотека активно развивается и используется в различных областях, включая безопасность сетевых соединений, шифрование данных и аутентификацию.
https://github.com/randombit/botan
#cpp #programming
👉 @cpp_lib
C++ — мощный инструмент, но с ним нужно правильно работать
Хотите писать на C++, но настройка окружения кажется головной болью?
◽️ Компилятор не видит файлы?
◽️Дебаг работает через раз?
◽️VSCode — просто красивый редактор?
💡 Приходите на открытый вебинар «Готовим рабочее место: C++ + VSCode»!
📅 5 марта в 20:00 (мск)
Мы разберём:
◽️Как настроить VSCode для C++: компиляторы, расширения, дебаг
◽️Как запускать программы без ошибок и ручной магии
◽️Как сделать среду разработки удобной и эффективной
🎯 А ещё всем участникам подарим скидку на топовый курс «C++ Developer»!
🔗 Регистрация: https://vk.cc/cIZCSZ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
📌 Оптимизация кода в C++: Используем 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)); // 🔥 Теперь перемещение!
}
std::move
при возврате локальных объектов — дайте компилятору сделать свое дело! std::move
, когда объект больше не нужен — это ускорит работу кода. std::move
не используйте переменную, кроме как для присвоения нового значения. 👩💻 C++: не просто язык, а ключ к карьере в топовой IT-компании!
Повышение квалификации на курсе «C++ Developer. Professional» — ваш ключ к тому, чтобы прокачать навыки и стать востребованным разработчиком.
Что вас ждёт:
— Работа с новыми стандартами C++20 и C++23.
— 14 практических работ для портфолио.
— Освоение многопоточного программирования, сетей и работы с данными.
— Понимание паттернов проектирования и тонкостей языка.
Почему выбирают нас?
— Преподаватели — опытные эксперты из ведущих IT-компаний.
— Живые лекции, поддержка на каждом этапе обучения.
— Диплом OTUS, который ценят работодатели.
🔥 До 28.02 скидка на все курсы 10%, кроме этого дарим промокод CPPPRO2025_02 который прибавляет к скидке еще 5% !!!
🎫 Курс можно приобрести в рассрочку
➡️ Пройти тест и забрать скидку: https://vk.cc/cIX0dR
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Проект для мидлов:
создайте курс для Яндекс Практикума!
Яндекс Практикум — сервис современного онлайн-образования, где обучают актуальным цифровым профессиям. Сейчас есть возможность присоединиться к команде и разработать курс C++ разработчика.
Роль автора подойдёт тем, кто любит погрузиться с головой в контент — разрабатывать уроки, задания, тесты, чек-листы, памятки, квизы; нагрузка от 10 часов в неделю.
Будущего коллегу окружим комфортом:
▪︎ сотрудничайте с нами удалённо,
▪︎ получайте дополнительный доход,
▪︎ влейтесь в наше энергичное и яркое комьюнити!
Посмотрите, что ожидают от кандидата, и откликайтесь, если интересно.
Приглашаем на встречу РГ21 по C++
Приходите обсудить новости последней встречи международного комитета по стандартизации языка. Ещё в программе — ответы на ваши вопросы о стандарте С++ и афтерпати.
Встречу проведёт Антон Полухин, руководитель группы разработки общих компонентов Техплатформы городских сервисов Яндекса.
Москва, онлайн и офлайн 25 марта.
Регистрируйтесь.
Dear ImGui — это мощная библиотека для создания графических интерфейсов пользователя (GUI) с использованием C++. Она ориентирована на разработчиков, которым нужен быстрый и удобный способ добавления интерфейса в приложения, такие как инструменты отладки, редакторы и визуализаторы.
Особенности:
- Простота и скорость — не требует сложной инициализации и минимально нагружает рендеринг.
- Независимость от платформы — можно использовать с OpenGL, Vulkan, DirectX и другими графическими API.
- Гибкость — позволяет создавать сложные UI-компоненты с минимальным количеством кода.
- Активное сообщество — регулярные обновления и множество готовых решений.
ИмGui подходит для использования в геймдеве, графических редакторах, утилитах для работы с данными и других проектах, требующих быстрого и интерактивного интерфейса.
https://github.com/ocornut/imgui
#cpp #programming
👉 @cpp_lib
Подборка Telegram каналов для программистов
/channel/lifeproger Жизнь программиста. Авторский канал.
/channel/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
/channel/rabota1C_rus 1С Работа
Системное администрирование 📌
/channel/sysadmin_girl Девочка Сисадмин
/channel/srv_admin_linux Админские угодья
/channel/linux_srv Типичный Сисадмин
/channel/linux_odmin Linux: Системный администратор
/channel/devops_star DevOps Star (Звезда Девопса)
/channel/i_linux Системный администратор
/channel/linuxchmod Linux
/channel/sys_adminos Системный Администратор
/channel/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
/channel/sysadminof Книги для админов, полезные материалы
/channel/i_odmin Все для системного администратора
/channel/i_odmin_book Библиотека Системного Администратора
/channel/i_odmin_chat Чат системных администраторов
/channel/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
/channel/sysadminoff Новости Линукс Linux
1C разработка 📌
/channel/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
/channel/cpp_lib Библиотека C/C++ разработчика
/channel/cpp_knigi Книги для программистов C/C++
/channel/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
/channel/pythonofff Python академия. Учи Python быстро и легко🐍
/channel/BookPython Библиотека Python разработчика
/channel/python_real Python подборки на русском и английском
/channel/python_360 Книги по Python Rus
Java разработка 📌
/channel/BookJava Библиотека Java разработчика
/channel/java_360 Книги по Java Rus
/channel/java_geek Учим Java на примерах
GitHub Сообщество 📌
/channel/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
/channel/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
/channel/developer_mobila Мобильная разработка
/channel/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
/channel/frontend_1 Подборки для frontend разработчиков
/channel/frontend_sovet Frontend советы, примеры и практика!
/channel/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
/channel/game_devv Все о разработке игр
Библиотеки 📌
/channel/book_for_dev Книги для программистов Rus
/channel/programmist_of Книги по программированию
/channel/proglb Библиотека программиста
/channel/bfbook Книги для программистов
/channel/books_reserv Книги для программистов
БигДата, машинное обучение 📌
/channel/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
/channel/bookflow Лекции, видеоуроки, доклады с IT конференций
/channel/coddy_academy Полезные советы по программированию
/channel/rust_lib Полезный контент по программированию на Rust
/channel/golang_lib Библиотека Go (Golang) разработчика
/channel/itmozg Программисты, дизайнеры, новости из мира IT
/channel/php_lib Библиотека PHP программиста 👨🏼💻👩💻
/channel/nodejs_lib Подборки по Node js и все что с ним связано
/channel/ruby_lib Библиотека Ruby программиста
QA, тестирование 📌
/channel/testlab_qa Библиотека тестировщика
Шутки программистов 📌
/channel/itumor Шутки программистов
Защита, взлом, безопасность 📌
/channel/thehaking Канал о кибербезопасности
/channel/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
/channel/ux_web Статьи, книги для дизайнеров
Английский 📌
/channel/UchuEnglish Английский с нуля
Математика 📌
/channel/Pomatematike Канал по математике
/channel/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак📌
/channel/Excel_lifehack
/channel/tikon_1 Новости высоких технологий, науки и техники💡
/channel/mir_teh Мир технологий (Technology World)
Вакансии 📌
/channel/sysadmin_rabota Системный Администратор
/channel/progjob Вакансии в IT
✅ Пишете код на C, но как только дело доходит до структур и массивов — начинается хаос?
Указатели путаются, память ведет себя странно, а программы работают не так, как задумано. Еще немного — и кажется, что проще уйти в Python.
Но ведь C — основа программирования, а низкоуровневые знания делают из программиста профессионала.
Представьте, что вы можете уверенно работать со структурами, оптимизировать код и писать эффективные приложения.
⏺На открытом вебинаре 27 февраля в 20:00 мск «Структуры и массивы Си в действии: Пишем менеджер библиотеки» мы разберем работу со структурами и массивами в C на практике: создадим систему учета книг, напишем код без классов и научимся грамотно управлять памятью.
Регистрируйтесь, если хотите перестать бояться указателей и разобраться в структурном программировании на C. Бонус — скидка на большое обучение «Программист С» для участников урока.
➡️ Регистрация открыта: https://vk.cc/cINX2TРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
📌 Уменьшаем размер исполняемого файла в C++
Всем добрый вечер! Хочу поделиться парой трюков, которые помогут уменьшить размер исполняемого файла вашей программы на C++. Это полезно, если вы пишете под встраиваемые системы, создаёте утилиты или просто хотите более компактный бинарник.
🔹 1. Отключаем отладочную информацию
Компиляторы по умолчанию добавляют отладочные символы в бинарник. Их можно убрать флагами:
g++ -o my_program my_program.cpp -O2 -s
-s
удаляет все отладочные символы. -O2
или -Os
, чтобы компилятор оптимизировал код для уменьшения размера:
g++ -o my_program my_program.cpp -Os
-Os
специально оптимизирует код для минимального размера. -shared
для .so в Linux, /MD
в MSVC). -static
) позволяет избавиться от лишних зависимостей. strip
, чтобы дополнительно очистить бинарник:
strip my_program
-ffunction-sections -fdata-sections
и --gc-sections
, чтобы убрать неиспользуемый код. dynamic_cast
и исключения, отключите их:
g++ -o my_program my_program.cpp -Os -fno-rtti -fno-exceptions
📌 Оптимизация кода: стоит ли всегда инлайнить функции?
Привет, сегодня поговорим о inline функциях в C++. Часто вижу, как новички (да и не только) злоупотребляют этим ключевым словом. Давайте разберемся, стоит ли всегда использовать inline
для оптимизации кода.
🔎 Что делает inline
?
Когда вы помечаете функцию как inline
, компилятор может (но не обязан) заменить вызовы этой функции её телом, чтобы избежать накладных расходов на вызов.
🔥 Когда inline
полезен?
✅ Очень короткие функции (1-2 строчки). Например:
inline int square(int x) { return x * x; }
inline
во вред?constexpr
!constexpr
, который не только инлайнит, но и выполняет вычисления на этапе компиляции:
constexpr int cube(int x) { return x * x * x; }
constexpr
— делайте, это лучше, чем просто inline
!inline
— мощный инструмент, но применять его стоит с умом. Лучше доверять компилятору и включить оптимизацию -O2
или -O3
, чем разбрасываться inline
без разбора.inline
в своих проектах? Пишите в комментариях! 💬🔥Что такое TCP Server Project в C++?
💬 TCP Server Project — это проект, который реализует сервер для обмена данными по протоколу TCP (Transmission Control Protocol). Такой сервер позволяет клиентам подключаться к нему, отправлять запросы и получать ответы через надёжное соединение.
На практике TCP-сервер в C++ создаётся с помощью сокетов (например, используя Berkeley sockets на Linux или Winsock на Windows).
Процесс обычно включает:
• Создание сокета — создаётся дескриптор для коммуникации.
• Привязка к порту (bind) — сервер привязывается к определённому порту на хосте.
• Прослушивание соединений (listen) — сервер ожидает входящие подключения.
• Принятие соединений (accept) — сервер принимает запросы от клиентов.
• Обмен данными — сервер и клиент обмениваются сообщениями через соединение.
📌 Пример применения: чаты, игровые серверы, веб-серверы и любые приложения, требующие стабильного соединения с гарантией доставки данных.
#cpp #programming
👉 @cpp_lib
⚡️Кросс-платформа — твой новый шаг в развитии iOS!
Ты знаешь, как делать приложения для iOS. А теперь представь, что один и тот же код может работать и на iOS, и на Android. Пора узнать, как реализовать это с помощью KMP?
На открытом вебинаре 19 февраля в 20:00 мск ты узнаешь:
- Что такое кросс-платформенная разработка и почему она — будущее;
- Как сделать iOS-приложение мультиплатформенным;
- Как использовать актуальные инструменты Compose Multiplatform.
Зарегистрируйся на открытый урок в преддверие старта курса «iOS Developer»! Все участники получат скидку на обучение. Встречаемся 19 февраля в 20:00 мск.
👉Регистрируйтесь: https://vk.cc/cIGAjd
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Многопоточное программирование на C
Многопоточное программирование — это специализированная форма параллельного программирования, которая предполагает выполнение нескольких потоков в рамках одного процесса или приложения. Объясню - каждая система состоит из процессов, а процесс состоит из потоков. Потоков может быть как несколько так и один. То есть один процесс выполняет несколько действий одновременно. Многопоток нужен в основном для оптимизации использования ресурсов, для программирования интерфейсов - как упомянул раннее выполнение нескольких действийй одновременно. Многопоточность незаменима тогда, когда необходимо, чтобы графический интерфейс продолжал отзываться на действия пользователя во время выполнения некоторой обработки информации. Не будем тянуть, а перейдем к делу.
Тут я написал небольшое приложение которое создает поток и выводит с его помощью числа от одного до 10 с небольшой задержкой.
#include <gtk-4.0/gtk/gtk.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
static void *thread_function(void *data) {
for (int i = 1; i <= 10; i++) {
printf("Thread: %d\n", i);
sleep(1);
}
return NULL;
}
static void on_button_clicked(GtkWidget *widget, gpointer data) {
pthread_t thread;
if (pthread_create(&thread, NULL, thread_function, NULL) != 0) {
g_print("Ошибка создания потока\n");
}
pthread_detach(thread);
}
int main(int argc, char *argv[]) {
GtkWidget *window;
GtkWidget *button;
gtk_init(&argc, &argv);
window = gtk_window_new();
gtk_window_set_title(GTK_WINDOW(window), "Многопоточная программа");
gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
button = gtk_button_new_with_label("Запустить поток");
g_signal_connect(button, "clicked", G_CALLBACK(on_button_clicked), NULL);
gtk_window_set_child(GTK_WINDOW(window), button);
gtk_widget_show(window);
gtk_main();
return 0;
}
//gcc threading.c -o thread_gui.o -lpthread Надо было добавить чтобы выводило и номер потока но что-то до меня не много не дошлоНадо было добавить чтобы выводило и номер потока но что-то до меня не много не дошло