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

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

Открыть в Telegram

Полезные материалы по всему, что может быть полезно плюсовику/сишнику. По всем вопросам @evgenycarter

Больше
7 321
Подписчики
-324 часа
+57 дней
+1230 день
Архив постов
📌 Оптимизация кода: 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

✅ Пишете код на C, но как только дело доходит до структур и массивов — начинается хаос? Указатели путаются, память ведет себя
✅ Пишете код на C, но как только дело доходит до структур и массивов — начинается хаос? Указатели путаются, память ведет себя странно, а программы работают не так, как задумано. Еще немного — и кажется, что проще уйти в Python. Но ведь C — основа программирования, а низкоуровневые знания делают из программиста профессионала. Представьте, что вы можете уверенно работать со структурами, оптимизировать код и писать эффективные приложения. ⏺На открытом вебинаре 27 февраля в 20:00 мск «Структуры и массивы Си в действии: Пишем менеджер библиотеки» мы разберем работу со структурами и массивами в C на практике: создадим систему учета книг, напишем код без классов и научимся грамотно управлять памятью. Регистрируйтесь, если хотите перестать бояться указателей и разобраться в структурном программировании на C. Бонус — скидка на большое обучение «Программист С» для участников урока. ➡️ Регистрация открыта: https://vk.cc/cINX2T Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

C++26 — встреча ISO в Хагенберге В середине февраля в Хагенберге состоялась встреча международного комитета по стандартизации
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++ Всем добрый вечер! Хочу поделиться парой трюков, которые помогут уменьшить размер исполняемого файла вашей программы на 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

📌 Оптимизация кода: стоит ли всегда инлайнить функции? Привет, сегодня поговорим о 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

🦾Хардкорный тест по языку С++🦾 📌Пройдите тест из 20 вопросов и проверьте, насколько вы готовы к обучению на углубленном ку
🦾Хардкорный тест по языку С++🦾 📌Пройдите тест из 20 вопросов и проверьте, насколько вы готовы к обучению на углубленном курсе «C++ Developer. Professional» от OTUS. Сможете сдать - пройдете на курс по спеццене! 💻 В программе курса — все актуальные инструменты, необходимые Middle разработчику на C++. Возможна рассрочка. 🎫 Курс можно приобрести в рассрочку ➡️ Пройти тест и забрать welcome-скидку: https://vk.cc/cIJY4K Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Что такое 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

🔥 Как правильно сравнивать 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

⚡️Кросс-платформа — твой новый шаг в развитии iOS! Ты знаешь, как делать приложения для iOS. А теперь представь, что один и т
⚡️Кросс-платформа — твой новый шаг в развитии iOS! Ты знаешь, как делать приложения для iOS. А теперь представь, что один и тот же код может работать и на iOS, и на Android. Пора узнать, как реализовать это с помощью KMP? На открытом вебинаре 19 февраля в 20:00 мск ты узнаешь: - Что такое кросс-платформенная разработка и почему она — будущее; - Как сделать iOS-приложение мультиплатформенным; - Как использовать актуальные инструменты Compose Multiplatform. Зарегистрируйся на открытый урок в преддверие старта курса «iOS Developer»! Все участники получат скидку на обучение. Встречаемся 19 февраля в 20:00 мск. 👉Регистрируйтесь: https://vk.cc/cIGAjd Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Грязные трюки C++ из userver и Boost Привет, я Антон Полухин из Техплатформы Екома и Райдтеха Яндекса. Моя команда разрабатыв
Грязные трюки C++ из userver и Boost Привет, я Антон Полухин из Техплатформы Екома и Райдтеха Яндекса. Моя команда разрабатывает userver — современный опенсорсный асинхронный фреймворк с богатым набором абстракций для быстрого и комфортного создания микросервисов, сервисов и утилит на C++. Когда мы пишем какой‑то код для userver и для таких сложных проектов, как Boost, периодически мы сталкиваемся с нестандартными проблемами. И эти нестандартные проблемы требуют нестандартных решений. Вот о таких решениях мы сегодня и поговорим. А именно: - Посмотрим, как работают исключения на платформе Linux x86, и сделаем с ними что‑то интересное. - Залезем ещё глубже под капот исключений и сделаем их ещё быстрее. - Сделаем висячую ссылку на невалидный объект, и всё будет хорошо. - А под конец то, что все любим, — погрузимся в шаблонное метапрограммирование. https://habr.com/ru/companies/yandex/articles/852244 #cpp #programming 👉 @cpp_lib

Многопоточное программирование на C Многопоточное программирование — это специализированная форма параллельного программирова
Многопоточное программирование на 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 Надо было добавить чтобы выводило и номер потока но что-то до меня не много не дошлоНадо было добавить чтобы выводило и номер потока но что-то до меня не много не дошло

https://habr.com/ru/articles/881444/ #cpp #programming 👉 @cpp_lib

Simple Term Colors Библиотека C++17 для работы с цветами в терминале. С поддержкой RGB и HSL! https://github.com/illyigan/sim
Simple Term Colors Библиотека C++17 для работы с цветами в терминале. С поддержкой RGB и HSL! https://github.com/illyigan/simple_term_colors #cpp #programming 👉 @cpp_lib

🔥 C++: умные указатели – избавляемся от delete навсегда! Вы все еще вручную освобождаете память? Это уже не актуально! Разбираем умные указатели (std::unique_ptr, std::shared_ptr) и их преимущества. 🔹 std::unique_ptr – для объектов, у которых один владелец. Память освобождается автоматически, когда указатель выходит из области видимости:

#include <memory>
#include <iostream>

int main() {
    std::unique_ptr<int> ptr = std::make_unique<int>(42);
    std::cout << *ptr << std::endl; // 42
}
🔹 std::shared_ptr – для объектов, у которых несколько владельцев. Когда последний shared_ptr уничтожается – объект тоже удаляется:

#include <memory>
#include <iostream>

int main() {
    std::shared_ptr<int> sp1 = std::make_shared<int>(42);
    std::shared_ptr<int> sp2 = sp1; // Теперь два владельца

    std::cout << *sp1 << " " << *sp2 << std::endl; // 42 42
}
❌ Забудьте про new и delete, используйте std::make_unique и std::make_shared. Это избавит вас от утечек памяти. А вы уже полностью отказались от delete? Пишите в комментариях! 👇 #cpp #programming 👉 @cpp_lib

Парсим С++ В этом вебинаре мы обсудили грамматические конструкции в С++ и как они работают. Мы поговорили о разных видах парсеров и о том, почему С++ сложно парсить. Мы также поделились некоторыми хитростями, позволяющими избежать чрезмерного замедления. источник #cpp #programming 👉 @cpp_lib

Как избежать утечек памяти в C? В C нет std::vector, а значит, памятью нужно управлять вручную. Как не допустить утечек? 📌 Основные правила: 1️⃣ Всегда проверяйте malloc:

   int* ptr = malloc(10 * sizeof(int));
   if (!ptr) { perror("malloc failed"); exit(1); }
   
2️⃣ Освобождайте память free(), когда она больше не нужна. 3️⃣ Используйте инструменты типа Valgrind для проверки утечек. Какой ваш любимый инструмент для поиска утечек памяти? #cpp #programming 👉 @cpp_lib

🔥 Почему в C++ стоит использовать std::vector, а не new[]? Раньше динамические массивы создавали так:

int* arr = new int[100];
delete[] arr;
Но это опасно! Почему? 📌 Минусы new[] и delete[]: ❌ Нужно вручную управлять памятью. ❌ Легко забыть delete[], вызвав утечки. ❌ Нет удобных методов работы с массивом. 📌 Преимущества std::vector: ✅ Автоматически управляет памятью. ✅ Имеет удобные методы (`push_back`, size, `resize`). ✅ Совместим с алгоритмами STL. Вот как лучше:

std::vector<int> arr(100);
А вы уже перешли на std::vector? #cpp #programming 👉 @cpp_lib

Constexpr — компилируем код на этапе сборки Сегодня хотел еще поговорть про constexpr и как он помогает делать код быстрее за счёт вычислений на этапе компиляции. Что делает constexpr? Если функция объявлена с constexpr, то компилятор попытается выполнить её во время компиляции, если это возможно. Простой пример:

constexpr int square(int x) {
    return x * x;
}
  
Теперь, если мы напишем:

int val = square(5);
  
То компилятор подставит 25 прямо в код, и вычисление не будет выполняться во время выполнения программы! Более сложный пример: Представьте, что у нас есть факториал:

constexpr int factorial(int n) {
    return (n <= 1) ? 1 : (n * factorial(n - 1));
}
  
Теперь вызов factorial(5) будет заменён на 120 ещё до запуска программы. 📌 Итог: constexpr помогает убирать лишние вычисления из рантайма, делая код быстрее. А вы используете constexpr? Делитесь своими кейсами! 🚀 #cpp #programming 👉 @cpp_lib

🎯 Ошибки в коде на C++ — враг номер один? Мы научим их побеждать! Приходите на открытый урок «Отладка в C++: место в жизненн
🎯 Ошибки в коде на C++ — враг номер один? Мы научим их побеждать! Приходите на открытый урок «Отладка в C++: место в жизненном цикле разработки». Разберём работу с GDB, поиск утечек памяти, неопределённое поведение и многое другое. Хотите писать код, который работает без сюрпризов? Мы покажем, как использовать отладку, чтобы ошибки боялись вас. 🗓 Урок пройдёт 12 февраля в 20:00 мск. 👉 Регистрируйтесь сейчас и получите скидку на большое обучение на курсе «C++ Developer. Professional»: https://vk.cc/cIfoXL Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Оптимизация кода с помощью std::string_view Привет, друзья! Сегодня разберём полезную штуку для работы со строками — std::string_view. Если ваш код активно использует std::string, но вам нужно просто просматривать данные без ненужных аллокаций и копирований, то std::string_view — это то, что нужно! Пример проблемы:

std::string extract_extension(const std::string& filename) {
    size_t pos = filename.rfind('.');
    if (pos == std::string::npos) return "";
    return filename.substr(pos);
}
  
Казалось бы, код работает, но есть нюанс: substr(pos) создаёт новую строку, что лишний раз тратит память. Оптимизированный вариант:

std::string_view extract_extension(std::string_view filename) {
    size_t pos = filename.rfind('.');
    if (pos == std::string_view::npos) return {};
    return filename.substr(pos);
}
  
Здесь std::string_view просто создаёт представление на часть строки без копирования данных. 🔥 Итог: код стал быстрее и экономичнее! Используйте std::string_view, когда вам не нужно владение строкой. Что думаете? Используете std::string_view в своём коде? Делитесь в комментариях! 🔥 #cpp #programming 👉 @cpp_lib