Библиотека C/C++ разработчика | cpp, boost, qt – Telegram
Библиотека C/C++ разработчика | cpp, boost, qt
19.5K subscribers
2K photos
64 videos
16 files
4.28K links
Все самое полезное для плюсовика и сишника в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/d6cd2932

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17

#WXSSA
Download Telegram
🍙 Почему std::piecewise_construct принимает кортежи, а не variadic args?

Большинство разработчиков используют emplace в контейнерах и не задумываются, как map.emplace() различает аргументы для ключа и значения.

🔍 Под капотом

Когда вы вызываете map.emplace(key_args..., value_args...), компилятор не может понять, где заканчиваются аргументы ключа и начинаются аргументы значения. Для pair это особенно критично.

std::piecewise_construct — это тег-пустышка, которая активирует специальный конструктор pair:

pair(piecewise_construct_t, 
tuple<KeyArgs...>,
tuple<ValueArgs...>)


⚡️ Кортежи создают явную границу. Компилятор видит два отдельных пакета параметров и использует std::apply для распаковки каждого tuple в конструктор соответствующего элемента пары.

❗️Практика:

Без этого механизма невозможно было бы создать pair со сложными типами in-place. Теперь вы избегаете промежуточных копий и move-операций.

📍Навигация: ВакансииЗадачиСобесы

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

#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
💯4👍2🥰1
🏛 Борьба с Variable Shadowing

Затенение (shadowing) — когда локальная переменная скрывает переменную из внешней области видимости с тем же именем

В классах затенение особенно коварно: локальная переменная или параметр может скрыть член класса. И компилятор промолчит.

class Config {
int timeout_ = 5000;

public:
void setTimeout(int timeout_) { // параметр затеняет член!
timeout_ = timeout_;
// Член класса НЕ изменился
}
};


🍉 Способы решения проблемы

class Config {
int timeout_ = 5000;

public:
// 1. Разные имена
void setTimeout(int newTimeout) {
timeout_ = newTimeout;
}

// 2. Явный this->
void setTimeoutAlt(int timeout_) {
this->timeout_ = timeout_;
}

// 3. Через имя класса
void setTimeoutBase(int timeout_) {
Config::timeout_ = {timeout_};
}

// 4. Через временный объект
void setTimeoutDumb(int timeout_) {
*this = { .timeout = timeout_ };
// Но лучше так не писать
}
};


❗️ Включите -Wshadow-field для отлова таких багов.


📍Навигация: ВакансииЗадачиСобесы

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

#константная_правильность
Please open Telegram to view this post
VIEW IN TELEGRAM
👏4😁4👍2
This media is not supported in your browser
VIEW IN TELEGRAM
😁3🥱21
Оптимизация RAG-систем: архитектура и производительность

23 января в 19:00 разберём техническую сторону внедрения LLM на открытом уроке к курсу «Разработка ИИ агентов». Поговорим о контекстном поиске (RAG) и методах дообучения для создания высоконагруженных решений.

Спикер — Игорь Стурейко, тимлид в «Газпроме» и AI-архитектор сложных решений на базе Kubernetes. Игорь подготовил видео о том, как инженерные принципы и MLOps помогают строить надёжных автономных агентов.

В программе занятия:

— эффективная индексация документов в векторные хранилища;
— использование LangChain и библиотек для работы с эмбеддингами;
— сравнение подходов RAG vs Fine-tuning.

📅 Когда: 23.01 в 19:00 МСК

Узнать подробности
1👍1😁1
😎 Топ-вакансий для C++ разработчиков за неделю

C developer (MES) — Офис (Новосибирск)

Разработчик систем компьютерного зрения C++ — от 4000 и до 7000 $
Удалёнка

Middle/Senior C++ разработчик — Удалёнка

✍️ Еще больше топовых вакансий — в нашем канале C++ jobs

📍Навигация: ВакансииЗадачиСобесы

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

#буст
👍1😁1👾1
✏️ Как одно ключевое слово ускоряет код?

final — это не только запрет наследования. Это подсказка компилятору для девиртуализации. Компилятор получает гарантию, что другой реализации не будет.


🍉 До и после:
class Base {
virtual void process() = 0;
};

class Derived : public Base {
void process() override final { /* ... */ }
// ^^^^^
};


Теперь компилятор знает: Derived::process — последняя версия. При вызове через Derived* или Derived& он может девиртуализировать:

void hotPath(Derived& obj) {
obj.process(); // прямой вызов, не через vtable
}


📍Навигация: ВакансииЗадачиСобесы

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

#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1
👻 std::atexit — зачем регистрировать функции на выход?

Когда твоя программа завершается, нужно освободить ресурсы, закрыть логи, сохранить состояние. std::atexit позволяет зарегистрировать функции, которые вызовутся автоматически при нормальном завершении программы.

#include <cstdlib>
#include <iostream>

void cleanup() {
std::cout << "Cleaning up resources...\n";
}

int main() {
std::atexit(cleanup);
std::cout << "Program running...\n";
return 0; // cleanup() вызовется автоматически
}


Ключевой момент: функции вызываются в порядке, обратном регистрации (LIFO).

❗️ Важно: std::atexit работает только при нормальном завершении (return из main или std::exit). При std::abort или неперехваченных исключениях функции не вызовутся.

❗️Best practice: используй RAII и деструкторы вместо atexit, когда это возможно. atexit — для глобального состояния и C-совместимости.


✏️ Используешь ли ты atexit в своих проектах?

📍Навигация: ВакансииЗадачиСобесы

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

#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
👏5👍2