Библиотека C/C++ разработчика | cpp, boost, qt
Все самое полезное для плюсовика и сишника в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/d6cd2932 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17 #WXSSA
Mostrar más📈 Análisis del canal de Telegram Библиотека C/C++ разработчика | cpp, boost, qt
El canal Библиотека C/C++ разработчика | cpp, boost, qt (@cppproglib) en el segmento lingüístico de Ruso es un actor destacado. Actualmente la comunidad reúne a 23 192 suscriptores, ocupando la posición 5 866 en la categoría Tecnologías y Aplicaciones y el puesto 28 983 en la región Rusia.
📊 Métricas de audiencia y dinámica
Desde su creación el невідомо, el proyecto ha mostrado un crecimiento acelerado, reuniendo a 23 192 suscriptores.
Según los últimos datos del 05 junio, 2026, el canal mantiene una actividad estable. En los últimos 30 días la variación de miembros fue de -10 788, y en las últimas 24 horas de -8, conservando un alto alcance.
- Estado de verificación: No verificado
- Tasa de interacción (ER): El promedio de interacción de la audiencia es 6.89%. Durante las primeras 24 horas tras publicar, el contenido suele obtener 4.01% de reacciones respecto al total de suscriptores.
- Alcance de las publicaciones: Cada publicación recibe en promedio 1 597 visualizaciones. En el primer día suele acumular 931 visualizaciones.
- Reacciones e interacción: La audiencia responde de forma activa: el promedio de reacciones por publicación es 9.
- Intereses temáticos: El contenido se centra en temas clave como c++, навигация, компилятор, удалёнка, developer.
📝 Descripción y política de contenido
El autor describe el recurso como un espacio para expresar opiniones subjetivas:
“Все самое полезное для плюсовика и сишника в одном канале.
По рекламе: @proglib_adv
Учиться у нас: https://proglib.io/w/d6cd2932
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
#WXSSA”
Gracias a la alta frecuencia de actualizaciones (últimos datos recibidos el 06 junio, 2026), el canal mantiene la vigencia y un amplio alcance. La analítica demuestra que la audiencia interactúa activamente con el contenido, lo que lo convierte en un punto de referencia dentro de la categoría Tecnologías y Aplicaciones.
purego решает всё это, позволяя вызывать C-функции из чистого Go.
Откуда взялся проект
Библиотека выросла из игрового движка Ebitengine. Его авторы портировали движок на чистый Go для Windows, что позволило кросс-компилировать на Windows с любой ОС одной командой GOOS=windows. purego родился, чтобы принести тот же подход на macOS, Linux и другие платформы.
Что даёт purego
Без Cgo отпадает необходимость в C-компиляторе. Вы можете собирать проект под другую платформу, просто задав GOOS и GOARCH. Сборка кешируется целиком как обычный Go-проект и работает быстрее. Бинарники становятся меньше, потому что Cgo генерирует обёртку на C для каждого вызова, а purego этого не делает.
Ещё purego умеет загружать символы из shared-библиотек в рантайме. Это можно использовать как систему плагинов или для FFI-вызовов в библиотеки на других языках, скомпилированные в .so / .dylib / .dll.
purego работает и при CGO_ENABLED=1. Это значит, что можно портировать проект с Cgo на purego постепенно, не переписывая всё разом.
Как это выглядит в коде
API минимальный. Вы открываете библиотеку через Dlopen, затем регистрируете Go-функцию, которая будет вызывать C:
package main
import (
"fmt"
"runtime"
"github.com/ebitengine/purego"
)
func getSystemLibrary() string {
switch runtime.GOOS {
case "darwin":
return "/usr/lib/libSystem.B.dylib"
case "linux":
return "libc.so.6"
default:
panic(fmt.Errorf("GOOS=%s is not supported", runtime.GOOS))
}
}
func main() {
libc, err := purego.Dlopen(getSystemLibrary(), purego.RTLD_NOW|purego.RTLD_GLOBAL)
if err != nil {
panic(err)
}
var puts func(string)
purego.RegisterLibFunc(&puts, libc, "puts")
puts("Calling C from Go without Cgo!")
}
Обратите внимание на RegisterLibFunc. Вы объявляете переменную с нужной Go-сигнатурой, а purego привязывает её к C-функции по имени. Никаких // #cgo директив, никаких .h файлов.
Когда стоит использовать
purego подходит, если вам нужно вызывать C-библиотеку из Go и при этом важна простота сборки и кросс-компиляция. Типичные сценарии — работа с системными библиотеками, графические движки, аудио, нативные SDK.
Если ваш проект уже плотно завязан на Cgo и работает на одной платформе, смысла переезжать может не быть. Но если вы начинаете новый проект или хотите избавиться от зависимости на C-тулчейн, purego стоит попробовать.
➡️ Репозиторий
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoToProductionswitch-case для превращения enum в строку. C++26 предлагает забыть об этом — в стандарт входит compile-time reflection.
• Появляются два новых оператора: ^^ (reflection operator) и [: :] (splicer). Первый превращает любую C++-сущность — тип, переменную, namespace, шаблон — в значение std::meta::info на этапе компиляции. Второй делает обратное: конвертирует std::meta::info обратно в тип, выражение или шаблон
• std::meta::info — это constexpr-хэндл к сущности. По сути, программа получает возможность исследовать собственную структуру в compile-time, не прибегая к макросам или кодогенерации
• Практический пример — generic to_enum_string(). Через std::meta::enumerators_of(^^T) получаем список enumerator-ов, итерируемся по ним с помощью template for, сплайсим значение через [:e:] и достаём имя через std::meta::identifier_of. Добавил новый enumerator — всё работает автоматически
• Для итерации используется std::define_static_array — отдельный proposal C++26, без которого развернуть expansion statement пока не получится
Вместо ручного switch-case, который ломается при каждом добавлении нового значения, reflection даёт обобщённое решение на уровне языка. Никакой кодогенерации, никаких макросов — чистый constexpr-код с полной type safety.
🍴 Подробнее
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#бустstd::vector<std::string> names = {"Алиса", "Борис", "Виктор"};
std::vector<int> scores = {95, 82, 78};
// Получаем пары (имя, балл)
for (auto [name, score] : views::zip(names, scores)) {
std::cout << name << ": " << score << "\n";
}
// Алиса: 95
// Борис: 82
// Виктор: 78
zip заканчивается на самом коротком диапазоне — безопасно при разной длине. Внутри возвращается std::tuple, а structured bindings разбирают его на отдельные переменные.
❗️ views::zip возвращает ссылки на элементы исходных контейнеров. Модификация через structured binding изменит оригинальные данные.
🥨 views::enumerate — индекс + значение (C++23)
std::vector<int> data = {10, 50, 30, 90, 20};
for (auto [i, val] : data | views::enumerate) {
if (val > 40) {
std::cout << "Первое превышение на позиции " << i << "\n";
break;
}
}
// Первое превышение на позиции 1
Раньше для этого приходилось писать views::zip(views::iota(0), data) (см. предыдущий пост про генераторы). Теперь — в одну строку.
❗️ Тип индекса в enumerate — это range_difference_t, а не int или size_t. На практике разница редко бьёт, но при сравнении с size() компилятор может выдать предупреждение о знаковости.
🧊 Главное свойство
Как и все views, zip и enumerate ленивые — они не создают копий и не выделяют память. Это лёгкие обёртки поверх исходных данных, которые вычисляются только при обращении к элементу.
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильностьiostream и статической линковкой на GCC 15 выдаёт бинарник в 2,3 МБ. Для вывода 11 символов — как-то многовато.
• iostream тянет за собой инициализацию std::cout, std::stringstream, локали, виртуальные функции и шаблоны — всё это ради одного вызова operator<<. Замена на printf сразу роняет размер до 42,5 КБ
• Флаг -s срезает ~1,2 МБ отладочной информации, которую компилятор зачем-то пихает в релизный бинарник по умолчанию
• Тенденция по версиям GCC показательна: тот же iostream-бинарник на GCC 3.4.2 весил 260 КБ, на 15.2.0 — уже 1,05 МБ. С каждой версией зависимости жиреют
Принцип «не плати за то, что не используешь» на практике работает ровно до того момента, пока компилятор сам не решит, что тебе нужно.
👉 Более детальный разбор
✏️ Вы проверяли, сколько весит ваш «минимальный» бинарник?
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#буст- Разберем реальные кейсы стартапов и ограничения LLM. - Обсудим рабочие архитектуры: RAG, human-in-the-loop, контроль качества. - Ответим на ваши вопросы и разберем кейсы участников.🎁 Бонусы: в конце вебинара подарим промокод на скидку 10.000 ₽ на курсы и разыграем подписки на полезные AI-сервисы. 👉 Зарегистрироваться на вебинар
// Реализуй класс LRUCache:
// - LRUCache(int capacity)
// - int get(int key) // O(1)
// - void put(int key, int val) // O(1)
//
// При переполнении вытесняется
// наименее недавно использованный элемент.
//
// Разрешено использовать STL.
✏️ Реализуй. Объясни выбор структур данных и почему сложность O(1).
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильностьRanges умеют генерировать их на лету — без выделения памяти под вектор. Разберём два главных генератора.
🍕 views::iota — числовой диапазон
Генерирует последовательность чисел в полуоткрытом интервале [start, end):
// Числа от 0 до 9
for (int i : views::iota(0, 10)) {
std::cout << i << " "; // 0 1 2 3 4 5 6 7 8 9
}
Можно передать только одно значение — получится бесконечная последовательность:
auto naturals = views::iota(1); // 1, 2, 3, 4, ...
auto first_10 = naturals | views::take(10);
❗️ Бесконечный диапазон обязательно нужно ограничить — например, через views::take.
🌳 Индексированный обход (zip + iota)
До появления views::enumerate пару (индекс, значение) получали через views::zip с iota:
std::vector<std::string> fruits = {"яблоко", "банан", "вишня"};
for (auto [i, fruit] : views::zip(views::iota(0), fruits)) {
std::cout << i << ": " << fruit << "\n";
}
// 0: яблоко
// 1: банан
// 2: вишня
В C++23 для этого есть views::enumerate — но zip + iota по-прежнему работает и даёт понять, как устроена индексация изнутри.
🍙 views::repeat — повторение значения (C++23)
Генерирует бесконечный поток из одного и того же значения:
for (int x : views::repeat(0) | views::take(5)) {
std::cout << x << " "; // 0 0 0 0 0
}
Или сразу с ограничением — передаём второй аргумент:
for (auto s : views::repeat("hello", 3)) {
std::cout << s << " "; // hello hello hello
}
❗️ Форма с двумя аргументами появилась в C++23 и возвращает конечный диапазон — views::take не нужен.
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильностьF11 (Step Into) в Visual Studio, отладчик проваливается в каждую функцию — включая стандартную библиотеку, runtime и сторонний код?
Функция Just My Code решает эту проблему. При включении отладчик автоматически перешагивает через код, который не принадлежит вашему проекту — будь то STL, CRT или любые внешние библиотеки.
🍀 Включить просто:
Tools → Options → Debugging → General → Enable Just My Code
🍬 Пример:
#include <vector>
#include <algorithm>
#include <iostream>
int doubleValue(int x) {
return x * 2; // ← ВАШ код
}
int main() {
std::vector<int> v = {3, 1, 4, 1, 5};
// F11 здесь без JMC → провалится в std::sort
std::sort(v.begin(), v.end());
// F11 здесь без JMC → провалится в std::transform
std::transform(v.begin(), v.end(), v.begin(), doubleValue);
return 0;
}
Без JMC: F11 на std::sort уводит вас в дебри introsort внутри STL.
С JMC: отладчик перепрыгивает sort и останавливается на следующей вашей строке.
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#буст
¡Ya disponible! Investigación de Telegram 2025 — los principales insights del año 
