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

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

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

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

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

#WXSSA
Download Telegram
🛠 restrict — keyword, которого нет в 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🤔42
«Этот манёвр будет стоить нам 51 год...»

Разработчики на C++ знают цену производительности. Оптимизируйте свой путь в обучении: забирайте курсы по архитектуре, алгоритмам и математике до того, как они подорожают.

До 19 января в Proglib Academy действуют старые условия:

— Разработка ИИ-агентов
— Математика для разработки AI-моделей
— ML для старта в Data Science
— Математика для Data Science
— Специалист по ИИ
— Алгоритмы и структуры данных
— Программирование на Python
— Основы IT для непрограммистов
— Архитектуры и шаблоны проектирования

Инвестировать в навыки

⚠️ Повышение цен уже 19 января
3😁3
😃 Задача на выходные

#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
😁21
📰 Свеженькое из мира 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
Прямой доступ к старым ценам закрывается

Завтра все программы Proglib.academy станут дороже. Успейте сегодня зафиксировать бюджет на обучение, пока стоимость не вышла из-под контроля.

Оптимизировать свой путь в IT
😁4❤‍🔥1
🍙 Почему 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👍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
👏3😁2