Библиотека C/C++ разработчика
6.8K subscribers
651 photos
689 videos
8 files
937 links
Полезные материалы по всему, что может быть полезно плюсовику/сишнику. По всем вопросам @evgenycarter
Download Telegram
Грязные трюки C++ из userver и Boost

Привет, я Антон Полухин из Техплатформы Екома и Райдтеха Яндекса. Моя команда разрабатывает userver — современный опенсорсный асинхронный фреймворк с богатым набором абстракций для быстрого и комфортного создания микросервисов, сервисов и утилит на C++.

Когда мы пишем какой‑то код для userver и для таких сложных проектов, как Boost, периодически мы сталкиваемся с нестандартными проблемами. И эти нестандартные проблемы требуют нестандартных решений. Вот о таких решениях мы сегодня и поговорим.

А именно:
- Посмотрим, как работают исключения на платформе Linux x86, и сделаем с ними что‑то интересное.
- Залезем ещё глубже под капот исключений и сделаем их ещё быстрее.
- Сделаем висячую ссылку на невалидный объект, и всё будет хорошо.
- А под конец то, что все любим, — погрузимся в шаблонное метапрограммирование.

https://habr.com/ru/companies/yandex/articles/852244

#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
🔥 Как правильно сравнивать std::string в C++?

Доброй ночи! Давайте разберём важную тему – сравнение std::string в C++. Многие думают, что это просто (== и всё), но есть нюансы! Давайте разберёмся.

Способы сравнения строк

1️⃣ Оператор ==
Если вам нужно проверить точное совпадение строк:

std::string str1 = "hello";
std::string str2 = "hello";

if (str1 == str2) {
std::cout << "Строки равны!\n";
}

Этот метод безопасен, читабелен и работает быстро.

2️⃣ Функция 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

3️⃣ Сравнение без учета регистра
В C++ нет встроенного метода, но можно использовать 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";
}


4️⃣ Сравнение подстрок
Если нужно проверить, начинается ли строка с подстроки:

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()

Какой метод вы чаще используете? Делитесь в комментариях!

#cpp #programming

👉 @cpp_lib
Что такое 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
🦾Хардкорный тест по языку С++🦾

📌Пройдите тест из 20 вопросов и проверьте, насколько вы готовы к обучению на углубленном курсе «C++ Developer. Professional» от OTUS.
Сможете сдать - пройдете на курс по спеццене!

💻 В программе курса — все актуальные инструменты, необходимые Middle разработчику на C++. Возможна рассрочка.

🎫 Курс можно приобрести в рассрочку

➡️ Пройти тест и забрать welcome-скидку: https://vk.cc/cIJY4K

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Оптимизация кода: стоит ли всегда инлайнить функции?

Привет, сегодня поговорим о inline функциях в C++. Часто вижу, как новички (да и не только) злоупотребляют этим ключевым словом. Давайте разберемся, стоит ли всегда использовать inline для оптимизации кода.

🔎 Что делает inline?
Когда вы помечаете функцию как inline, компилятор может (но не обязан) заменить вызовы этой функции её телом, чтобы избежать накладных расходов на вызов.

🔥 Когда inline полезен?
Очень короткие функции (1-2 строчки). Например:

inline int square(int x) { return x * x; }

Геттеры и сеттеры в классах, если они простые.
Функции-хелперы в заголовочных файлах (например, в `namespace`-ах).

⚠️ Когда inline во вред?
Большие функции. Раздувает бинарник, увеличивает время компиляции.
Часто изменяемый код. Так как `inline`-функции вставляются в код, изменение их логики требует перекомпиляции всех файлов, где они были вызваны.
Чрезмерное использование. Вставка слишком многих `inline`-функций может снизить эффективность процессорного кеша, что приведет к ухудшению производительности.

🎯 Альтернатива: constexpr!
В C++11 появился constexpr, который не только инлайнит, но и выполняет вычисления на этапе компиляции:

constexpr int cube(int x) { return x * x * x; }

Если можете сделать функцию constexpr — делайте, это лучше, чем просто inline!

🤔 Итог
inline — мощный инструмент, но применять его стоит с умом. Лучше доверять компилятору и включить оптимизацию -O2 или -O3, чем разбрасываться inline без разбора.

Как вы используете inline в своих проектах? Пишите в комментариях! 💬🔥

#cpp #programming

👉 @cpp_lib
📌 Уменьшаем размер исполняемого файла в C++

Всем добрый вечер! Хочу поделиться парой трюков, которые помогут уменьшить размер исполняемого файла вашей программы на C++. Это полезно, если вы пишете под встраиваемые системы, создаёте утилиты или просто хотите более компактный бинарник.

🔹 1. Отключаем отладочную информацию
Компиляторы по умолчанию добавляют отладочные символы в бинарник. Их можно убрать флагами:

g++ -o my_program my_program.cpp -O2 -s

Флаг -s удаляет все отладочные символы.

🔹 2. Оптимизируем код
Используйте -O2 или -Os, чтобы компилятор оптимизировал код для уменьшения размера:

g++ -o my_program my_program.cpp -Os

Флаг -Os специально оптимизирует код для минимального размера.

🔹 3. Статическая или динамическая линковка?
Если в системе уже есть нужные библиотеки, используйте динамическую линковку (-shared для .so в Linux, /MD в MSVC).
Но иногда статическая линковка (флаг -static) позволяет избавиться от лишних зависимостей.

🔹 4. Убираем ненужные зависимости
Можно использовать strip, чтобы дополнительно очистить бинарник:

strip my_program

А ещё, если пишете на C++, то не забывайте про -ffunction-sections -fdata-sections и --gc-sections, чтобы убрать неиспользуемый код.

🔹 5. Убираем RTTI и исключения
Если не используете dynamic_cast и исключения, отключите их:

g++ -o my_program my_program.cpp -Os -fno-rtti -fno-exceptions

Это существенно уменьшит размер!


#cpp #programming

👉 @cpp_lib
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
Пишете код на C, но как только дело доходит до структур и массивов — начинается хаос?

Указатели путаются, память ведет себя странно, а программы работают не так, как задумано. Еще немного — и кажется, что проще уйти в Python.
Но ведь C — основа программирования, а низкоуровневые знания делают из программиста профессионала.

Представьте, что вы можете уверенно работать со структурами, оптимизировать код и писать эффективные приложения.

На открытом вебинаре 27 февраля в 20:00 мск «Структуры и массивы Си в действии: Пишем менеджер библиотеки» мы разберем работу со структурами и массивами в C на практике: создадим систему учета книг, напишем код без классов и научимся грамотно управлять памятью.

Регистрируйтесь, если хотите перестать бояться указателей и разобраться в структурном программировании на C. Бонус — скидка на большое обучение «Программист С» для участников урока.

➡️ Регистрация открыта: https://vk.cc/cINX2T

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Оптимизация кода: 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 ещё используется.

🚀 Итог:
Использование std::string_view вместо const std::string& может ускорить работу с текстовыми данными и снизить нагрузку на аллокатор. Если не нужно изменять строку — это отличный выбор!

А вы уже используете std::string_view в своих проектах? Делитесь в комментариях! ⬇️

#cpp #programming

👉 @cpp_lib
Подборка Telegram каналов для программистов

https://t.me/lifeproger Жизнь программиста. Авторский канал.
https://t.me/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
https://t.me/rabota1C_rus 1С Работа

Системное администрирование 📌
https://t.me/sysadmin_girl Девочка Сисадмин
https://t.me/srv_admin_linux Админские угодья
https://t.me/linux_srv Типичный Сисадмин

https://t.me/linux_odmin Linux: Системный администратор
https://t.me/devops_star DevOps Star (Звезда Девопса)
https://t.me/i_linux Системный администратор
https://t.me/linuxchmod Linux
https://t.me/sys_adminos Системный Администратор
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux

1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С

Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах

Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus

Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах

GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub

Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных

Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin

Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано

Разработка игр 📌
https://t.me/game_devv Все о разработке игр

Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов

БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning

Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT
https://t.me/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста

QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика

Шутки программистов 📌
https://t.me/itumor Шутки программистов

Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_1 Статьи из "Хакера"

Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров

Английский 📌
https://t.me/UchuEnglish Английский с нуля

Математика 📌
https://t.me/Pomatematike Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике

Excel лайфхак📌
https://t.me/Excel_lifehack

https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)

Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Dear ImGui — это мощная библиотека для создания графических интерфейсов пользователя (GUI) с использованием C++. Она ориентирована на разработчиков, которым нужен быстрый и удобный способ добавления интерфейса в приложения, такие как инструменты отладки, редакторы и визуализаторы.

Особенности:
- Простота и скорость — не требует сложной инициализации и минимально нагружает рендеринг.
- Независимость от платформы — можно использовать с OpenGL, Vulkan, DirectX и другими графическими API.
- Гибкость — позволяет создавать сложные UI-компоненты с минимальным количеством кода.
- Активное сообщество — регулярные обновления и множество готовых решений.

ИмGui подходит для использования в геймдеве, графических редакторах, утилитах для работы с данными и других проектах, требующих быстрого и интерактивного интерфейса.

https://github.com/ocornut/imgui

#cpp #programming

👉 @cpp_lib
Ваш код тормозит под нагрузкой?

Не справляется с задачами параллельного вычисления?

💡 Приходите на открытый урок по многопоточному программированию C++!

▫️Вместе напишем многопоточную реализацию задачи подсчёта суммы чисел.
▫️Разберём примитивы синхронизации.
▫️Ускорим код с помощью стандартной библиотеки.

🎯 Вы начнёте осваивать многопоточное программирование и сделаете первый шаг к позициям middle+ в C++!

А ещё получите скидку на большое обучение «C++ Developer».

📅 Успейте записаться на открытый вебинар 25 февраля в 20:00 (мск)!

🔗 Регистрируйтесь прямо сейчас и узнайте, как эффективно управлять потоками в C++: https://vk.cc/cISn4e

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Создаем эмулятор Sega Mega Drive на C++

В этой статье описано создание эмулятора 16-битной приставки Sega Mega Drive на C++.

Будет много интересного: эмуляция процессора Motorola 68000, реверсинг игр, графика на OpenGL, шейдеры, и многое другое. И все это на современном C++. В статье много картинок, можно хоть на них посмотреть.

https://habr.com/ru/articles/871284/

#cpp #programming

👉 @cpp_lib
Приглашаем на встречу РГ21 по C++

Приходите обсудить новости последней встречи международного комитета по стандартизации языка. Ещё в программе — ответы на ваши вопросы о стандарте С++ и афтерпати.

Встречу проведёт Антон Полухин, руководитель группы разработки общих компонентов Техплатформы городских сервисов Яндекса.

Москва, онлайн и офлайн 25 марта.

Регистрируйтесь.