⚙️ std::scope_exit
std::scope_exit из заголовка (C++23) дает возможность автоматически выполнять код при выходе из области видимости. Это удобно для освобождения ресурсов и отмены операций без использования try/catch.
👩💻
@quizcpp
std::scope_exit из заголовка (C++23) дает возможность автоматически выполнять код при выходе из области видимости. Это удобно для освобождения ресурсов и отмены операций без использования try/catch.
👩💻
@quizcpp
❓ Вопрос на собеседовании
Что представляют собой корутины в C++ и как они функционируют?
Ответ ⬇️
Корутины в C++ — это механизм асинхронного выполнения кода, который даёт возможность приостанавливать и возобновлять выполнение функции без блокировки потока. В отличие от потоков, корутины являются лёгкими и не требуют создания новых системных потоков.
Корутины в C++ используют ключевые слова co_await, co_yield и co_return, а также требуют специального механизма возврата (std::generator, std::future, std::promise).
Пример использования ⚙️
#include
#include
struct Task {
struct promise_type {
Task get_return_object() { return {}; }
std::suspend_never initial_suspend() { return {}; }
std::suspend_never final_suspend() noexcept { return {}; }
void return_void() {}
void unhandled_exception() {}
};
};
Task myCoroutine() {
std::cout
@quizcpp
Что представляют собой корутины в C++ и как они функционируют?
Ответ ⬇️
Корутины в C++ — это механизм асинхронного выполнения кода, который даёт возможность приостанавливать и возобновлять выполнение функции без блокировки потока. В отличие от потоков, корутины являются лёгкими и не требуют создания новых системных потоков.
Корутины в C++ используют ключевые слова co_await, co_yield и co_return, а также требуют специального механизма возврата (std::generator, std::future, std::promise).
Пример использования ⚙️
#include
#include
struct Task {
struct promise_type {
Task get_return_object() { return {}; }
std::suspend_never initial_suspend() { return {}; }
std::suspend_never final_suspend() noexcept { return {}; }
void return_void() {}
void unhandled_exception() {}
};
};
Task myCoroutine() {
std::cout
@quizcpp
🚫 Антипаттерн недели: Применение new и delete вместо умных указателей
В C++ ручное управление памятью с помощью new и delete может вызвать утечки памяти, неопределённое поведение и ошибки двойного освобождения.
✔️ Используйте std::unique_ptr или std::shared_ptr, которые автоматически освобождают ресурсы при выходе из области видимости.
👩💻
@quizcpp
В C++ ручное управление памятью с помощью new и delete может вызвать утечки памяти, неопределённое поведение и ошибки двойного освобождения.
✔️ Используйте std::unique_ptr или std::shared_ptr, которые автоматически освобождают ресурсы при выходе из области видимости.
👩💻
@quizcpp
👎1
⚙️ std::condition_variable
Класс std::condition_variable в C++ предлагает способ синхронизации потоков, позволяя одному потоку ожидать уведомления от другого потока о произошедшем событии. Это важно для координации работы нескольких потоков в многопоточных приложениях.
👩💻
@quizcpp
Класс std::condition_variable в C++ предлагает способ синхронизации потоков, позволяя одному потоку ожидать уведомления от другого потока о произошедшем событии. Это важно для координации работы нескольких потоков в многопоточных приложениях.
👩💻
@quizcpp
⚙️ std::identity
std::identity (C++20) — это функциональный объект, который возвращает аргумент, который ему передан, без каких-либо изменений. Он полезен для адаптации алгоритмов.
👩💻
@quizcpp
std::identity (C++20) — это функциональный объект, который возвращает аргумент, который ему передан, без каких-либо изменений. Он полезен для адаптации алгоритмов.
👩💻
@quizcpp
❓ Вопрос на собеседовании
Как функционирует expression SFINAE в C++, и чем оно отличается от обычного SFINAE?
Ответ ⬇️
SFINAE (Substitution Failure Is Not An Error) позволяет компилятору игнорировать неподходящие шаблонные перегрузки, не выдавая ошибок. Expression SFINAE — это метод, при котором проверяется не только наличие типа, но и возможность использования выражения с этим типом.
Обычный SFINAE работает с typename, тогда как expression SFINAE применяется в decltype() для проверки существования определенных операций или методов в типе.
Пример использования ⚙️
#include
#include
// Проверяем, есть ли у типа метод size()
template
auto has_size(int) -> decltype(std::declval().size(), std::true_type{}) {
return {};
}
template
std::false_type has_size(...) { return {}; }
int main() {
std::cout
@quizcpp
Как функционирует expression SFINAE в C++, и чем оно отличается от обычного SFINAE?
Ответ ⬇️
SFINAE (Substitution Failure Is Not An Error) позволяет компилятору игнорировать неподходящие шаблонные перегрузки, не выдавая ошибок. Expression SFINAE — это метод, при котором проверяется не только наличие типа, но и возможность использования выражения с этим типом.
Обычный SFINAE работает с typename, тогда как expression SFINAE применяется в decltype() для проверки существования определенных операций или методов в типе.
Пример использования ⚙️
#include
#include
// Проверяем, есть ли у типа метод size()
template
auto has_size(int) -> decltype(std::declval().size(), std::true_type{}) {
return {};
}
template
std::false_type has_size(...) { return {}; }
int main() {
std::cout
@quizcpp
⚙️ std::from_chars
std::from_chars (C++17) предоставляет возможность быстро преобразовать строку в число без ненужных аллокаций и проверок на исключения, что делает его более быстрым, чем std::stoi.
👩💻
@quizcpp
std::from_chars (C++17) предоставляет возможность быстро преобразовать строку в число без ненужных аллокаций и проверок на исключения, что делает его более быстрым, чем std::stoi.
👩💻
@quizcpp
⚙️ std::bind_front
std::bind_front (C++20) позволяет предварительно привязывать первые аргументы функции или функторов, что упрощает их последующие вызовы.
👩💻
@quizcpp
std::bind_front (C++20) позволяет предварительно привязывать первые аргументы функции или функторов, что упрощает их последующие вызовы.
👩💻
@quizcpp
⚙️ std::countr_zero
std::countr_zero (C++20) подсчитывает, сколько нулевых битов находится в конце двоичного представления числа. Это полезно для выполнения битовых операций и оптимизаций.
👩💻
@quizcpp
std::countr_zero (C++20) подсчитывает, сколько нулевых битов находится в конце двоичного представления числа. Это полезно для выполнения битовых операций и оптимизаций.
👩💻
@quizcpp
⚙️ std::byteswap (C++23) изменяет порядок байтов в числе, что удобно для работы с системами big-endian и little-endian. 👩💻
@quizcpp
@quizcpp
👍1
⚙️ std::endian
std::endian (C++20) указывает на порядок байтов (big-endian или little-endian) в текущей системе. Это важно при взаимодействии с бинарными файлами и сетевыми протоколами.
👩💻
@quizcpp
std::endian (C++20) указывает на порядок байтов (big-endian или little-endian) в текущей системе. Это важно при взаимодействии с бинарными файлами и сетевыми протоколами.
👩💻
@quizcpp
👍1
⚙️ std::scope_guard
std::scope_guard (C++23) автоматически осуществляет заданное действие при выходе из области видимости, что способствует управлению ресурсами и предотвращает утечки.
👩💻
@quizcpp
std::scope_guard (C++23) автоматически осуществляет заданное действие при выходе из области видимости, что способствует управлению ресурсами и предотвращает утечки.
👩💻
@quizcpp
🔥2
⚙️ std::atomic_flag
std::atomic_flag — это базовый атомарный флаг, предназначенный для низкоуровневой синхронизации потоков без использования блокировок. Он полезен для создания спинлоков.
👩💻
@quizcpp
std::atomic_flag — это базовый атомарный флаг, предназначенный для низкоуровневой синхронизации потоков без использования блокировок. Он полезен для создания спинлоков.
👩💻
@quizcpp