Большинство думают, что корутины — это просто синтаксический сахар. На деле это хирургическая операция над указателем стека.
1. Сохраняет текущий RSP (указатель стека)
2. Копирует локальные переменные в heap-allocated фрейм
3. Переключает RSP на стек другой корутины
mov rsp, [coroutine_stack_ptr]
Процессор продолжает выполнение, но теперь все push/pop идут в другую область памяти. Регистры RBP, RIP тоже меняются — полная иллюзия «другой функции».
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9💯3❤2
🛠 restrict — keyword, которого нет в C++
Компилятор не может векторизовать, если боится, что указатели пересекаются.
❗️
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#под_капотом
Компилятор не может векторизовать, если боится, что указатели пересекаются.
// ❌ Компилятор не знает, пересекаются ли a и b
void add(float* a, float* b, size_t n) {
for (size_t i = 0; i < n; ++i) {
a[i] += b[i]; // Что если a и b — один массив?
}
}
// ✅ Подсказываем компилятору (C++20)
void add(float* __restrict a, float* __restrict b, size_t n) {
for (size_t i = 0; i < n; ++i) {
a[i] += b[i]; // Теперь векторизуется!
}
}
// ✅ Или используйте std::span (C++20)
void add(std::span<float> a, std::span<float> b) {
std::transform(a.begin(), a.end(), b.begin(), a.begin(),
std::plus<>{}); // Векторизуется автоматически
}
restrict — это ключевое слово из C99 (стандарта языка C), которое не является частью стандарта C++.📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🤔4❤2
🐸 Подборка вакансий для C++-разработчиков за неделю
Middle/Senior C++ разработчик [ИРТЕЯ] — Удалёнка
Разработчик C++ — Офис (Москва)
Разработчик систем компьютерного зрения C++ — от 4000 и до 7000 $ Удалёнка
Senior Developer Rust/C++ — Офис (Москва)
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#вакансии
Middle/Senior C++ разработчик [ИРТЕЯ] — Удалёнка
Разработчик C++ — Офис (Москва)
Разработчик систем компьютерного зрения C++ — от 4000 и до 7000 $ Удалёнка
Senior Developer Rust/C++ — Офис (Москва)
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#вакансии
👍3
«Этот манёвр будет стоить нам 51 год...»
Разработчики на
До 19 января в Proglib Academy действуют старые условия:
— Разработка ИИ-агентов
— Математика для разработки AI-моделей
— ML для старта в Data Science
— Математика для Data Science
— Специалист по ИИ
— Алгоритмы и структуры данных
— Программирование на Python
— Основы IT для непрограммистов
— Архитектуры и шаблоны проектирования
Инвестировать в навыки
⚠️ Повышение цен уже 19 января
Разработчики на
C++ знают цену производительности. Оптимизируйте свой путь в обучении: забирайте курсы по архитектуре, алгоритмам и математике до того, как они подорожают.До 19 января в Proglib Academy действуют старые условия:
— Разработка ИИ-агентов
— Математика для разработки AI-моделей
— ML для старта в Data Science
— Математика для Data Science
— Специалист по ИИ
— Алгоритмы и структуры данных
— Программирование на Python
— Основы IT для непрограммистов
— Архитектуры и шаблоны проектирования
Инвестировать в навыки
⚠️ Повышение цен уже 19 января
❤3😁3
Forwarded from Библиотека собеса по C++ | вопросы с собеседований
#include <iostream>
#include <thread>
#include <chrono>
struct Counter {
long long a;
long long b;
};
void increment(long long& val) {
for (int i = 0; i < 100'000'000; i++) val++;
}
int main() {
Counter cnt{ 0, 0 };
auto start = std::chrono::high_resolution_clock::now();
std::thread t1(increment, std::ref(cnt.a));
std::thread t2(increment, std::ref(cnt.b));
t1.join(); t2.join();
auto end = std::chrono::high_resolution_clock::now();
std::cout << "Time: " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms\n";
return 0;
}
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2❤1
📰 Свеженькое из мира C++
Подготовили подборку самых интересных материалов за неделю о разных аспектах программирования и интересных проектах в мире C++.
😎 Интересное:
• Время в C++: когда простое вычитание может сломать вашу программу —
разбор при работе со временем в C++
• Почему sleep(0) не бесполезен? — рассматриваем зачем нужен sleep(0)
• Настройка за 5 минут: Boost.Asio + CMake — быстрая настройка проекта для использования Asio
• Как std::hex меняет поведение вывода? — разбираемся как работают манипуляторы
• Почему compare_exchange_weak может «случайно» провалиться? — ответ на вопрос почему compare_exchange_weak может не сработать
• std::execution — параллелизм одной строкой — простой способ сделать ваш код параллельным
• Почему co_return не возвращает значение напрямую? — разбираемся как работают корутины
🔹📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#свежак
Подготовили подборку самых интересных материалов за неделю о разных аспектах программирования и интересных проектах в мире C++.
😎 Интересное:
• Время в C++: когда простое вычитание может сломать вашу программу —
разбор при работе со временем в C++
• Почему sleep(0) не бесполезен? — рассматриваем зачем нужен sleep(0)
• Настройка за 5 минут: Boost.Asio + CMake — быстрая настройка проекта для использования Asio
• Как std::hex меняет поведение вывода? — разбираемся как работают манипуляторы
• Почему compare_exchange_weak может «случайно» провалиться? — ответ на вопрос почему compare_exchange_weak может не сработать
• std::execution — параллелизм одной строкой — простой способ сделать ваш код параллельным
• Почему co_return не возвращает значение напрямую? — разбираемся как работают корутины
🔹📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#свежак
😁2🥰1
🍤 Введение в Direct2D
Подборка статьи по введению в Direct2D.
✍️ Статьи:
• Direct2D #1: альтернатива началу документации
• Direct2D #2: Очередь сообщений окна. Все виды манипуляций
• Direct2D #3. Типы окон: родительские, дочерние, владеемые. Все манипуляции с ними
• Direct2D #4 Графика. Введение
• Direct2D #5. Продолжение темы геометрии ID2D1Geometry и дочерние классы
• Direct2D #6. Продолжение геометрии. Пару слов о Mesh, масштабировании и сглаживании в Direct2D
• Direct 2D #7. Всё о тексте(От А до Я)
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#линкер_рекомендует
Подборка статьи по введению в Direct2D.
✍️ Статьи:
• Direct2D #1: альтернатива началу документации
• Direct2D #2: Очередь сообщений окна. Все виды манипуляций
• Direct2D #3. Типы окон: родительские, дочерние, владеемые. Все манипуляции с ними
• Direct2D #4 Графика. Введение
• Direct2D #5. Продолжение темы геометрии ID2D1Geometry и дочерние классы
• Direct2D #6. Продолжение геометрии. Пару слов о Mesh, масштабировании и сглаживании в Direct2D
• Direct 2D #7. Всё о тексте(От А до Я)
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#линкер_рекомендует
👍7
Прямой доступ к старым ценам закрывается
Завтра все программы Proglib.academy станут дороже. Успейте сегодня зафиксировать бюджет на обучение, пока стоимость не вышла из-под контроля.
Оптимизировать свой путь в IT
Завтра все программы Proglib.academy станут дороже. Успейте сегодня зафиксировать бюджет на обучение, пока стоимость не вышла из-под контроля.
Оптимизировать свой путь в IT
😁4❤🔥1
Большинство разработчиков используют 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
Forwarded from Библиотека задач по C++ | тесты, код, задания
Forwarded from Библиотека задач по C++ | тесты, код, задания
Что выведет код?
Anonymous Quiz
22%
0
38%
1
26%
Ошибка компиляции
9%
Undefined behavior
4%
Зависит от компилятора
😁5
🏛 Борьба с Variable Shadowing
В классах затенение особенно коварно: локальная переменная или параметр может скрыть член класса. И компилятор промолчит.
🍉 Способы решения проблемы
❗️ Включите -Wshadow-field для отлова таких багов.
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильность
Затенение (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_ };
// Но лучше так не писать
}
};📍Навигация: Вакансии • Задачи • Собесы
Библиотека 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🥱2❤1
Оптимизация RAG-систем: архитектура и производительность
23 января в 19:00 разберём техническую сторону внедрения LLM на открытом уроке к курсу «Разработка ИИ агентов». Поговорим о контекстном поиске (
Спикер — Игорь Стурейко, тимлид в «Газпроме» и AI-архитектор сложных решений на базе
В программе занятия:
— эффективная индексация документов в векторные хранилища;
— использование
— сравнение подходов
📅 Когда: 23.01 в 19:00 МСК
Узнать подробности
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++ разработчика
#буст
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 позволяет зарегистрировать функции, которые вызовутся автоматически при нормальном завершении программы.#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 или неперехваченных исключениях функции не вызовутся.📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
👏5👍2