⚙️ std::barrier
std::barrier из заголовка (доступно с C++20) синхронизирует выполнение потоков, ожидая, пока все участники не достигнут определённой точки (барьера). Это полезно для координации действий в многопоточных приложениях.
👩💻
@quizcpp
std::barrier из заголовка (доступно с C++20) синхронизирует выполнение потоков, ожидая, пока все участники не достигнут определённой точки (барьера). Это полезно для координации действий в многопоточных приложениях.
👩💻
@quizcpp
⚙️ std::monostate
std::monostate из заголовка используется как «пустой» тип внутри std::variant. Это полезно для добавления незначимого состояния, которое можно обработать отдельно.
👩💻
@quizcpp
std::monostate из заголовка используется как «пустой» тип внутри std::variant. Это полезно для добавления незначимого состояния, которое можно обработать отдельно.
👩💻
@quizcpp
❓ Вопрос на собеседовании
Что такое Placement new в C++ и как оно используется?
Ответ ⬇️
Placement new — это форма оператора new, которая позволяет разместить объект в заранее выделенной области памяти. Вместо выделения памяти на куче, как это делает обычный new, placement new создаёт объект в памяти, адрес которой передаётся в качестве аргумента.
Это используется для более точного контроля над памятью, например, в реализациях кастомных аллокаторов, пулах памяти или для повышения производительности в системах с ограниченными ресурсами.
Пример использования ⚙️
#include
#include // Для placement new
int main() {
alignas(alignof(int)) char buffer[sizeof(int)]; // Буфер для хранения объекта
int* ptr = new (buffer) int(42); // Размещение объекта в buffer
std::cout
@quizcpp
Что такое Placement new в C++ и как оно используется?
Ответ ⬇️
Placement new — это форма оператора new, которая позволяет разместить объект в заранее выделенной области памяти. Вместо выделения памяти на куче, как это делает обычный new, placement new создаёт объект в памяти, адрес которой передаётся в качестве аргумента.
Это используется для более точного контроля над памятью, например, в реализациях кастомных аллокаторов, пулах памяти или для повышения производительности в системах с ограниченными ресурсами.
Пример использования ⚙️
#include
#include // Для placement new
int main() {
alignas(alignof(int)) char buffer[sizeof(int)]; // Буфер для хранения объекта
int* ptr = new (buffer) int(42); // Размещение объекта в buffer
std::cout
@quizcpp
⚙️ std::move_iterator
Итератор std::move_iterator позволяет преобразовать обычный итератор в итератор, который перемещает элементы вместо их копирования. Это особенно полезно при работе с контейнерами, содержащими "тяжелые" объекты, такие как std::string или std::vector, чтобы избежать лишних копирований.
👩💻
@quizcpp
Итератор std::move_iterator позволяет преобразовать обычный итератор в итератор, который перемещает элементы вместо их копирования. Это особенно полезно при работе с контейнерами, содержащими "тяжелые" объекты, такие как std::string или std::vector, чтобы избежать лишних копирований.
👩💻
@quizcpp
❓ Вопрос на собеседовании
Как работает zero-cost exceptions в C++ и почему они эффективны?
Ответ ⬇️
Zero-cost exceptions означают, что во время нормального выполнения кода исключения не влияют на производительность. Вместо проверок компилятор создаёт таблицы (.eh_frame в ELF), которые используются только при выбросе исключения. В отличие от if-проверок ошибок, исключения C++ не замедляют код, пока не происходит ошибка.
Пример использования ⚙️
#include
#include
void risky() { throw std::runtime_error("Ошибка!"); }
int main() {
try { risky(); }
catch (const std::exception& e) { std::cout
@quizcpp
Как работает zero-cost exceptions в C++ и почему они эффективны?
Ответ ⬇️
Zero-cost exceptions означают, что во время нормального выполнения кода исключения не влияют на производительность. Вместо проверок компилятор создаёт таблицы (.eh_frame в ELF), которые используются только при выбросе исключения. В отличие от if-проверок ошибок, исключения C++ не замедляют код, пока не происходит ошибка.
Пример использования ⚙️
#include
#include
void risky() { throw std::runtime_error("Ошибка!"); }
int main() {
try { risky(); }
catch (const std::exception& e) { std::cout
@quizcpp
🚫 Антипаттерн недели: Использование endl вместо \n в циклах
В C++ std::endl не просто переносит строку, но также принудительно сбрасывает буфер вывода, что замедляет выполнение кода в циклах. При частом использовании в больших программах это может значительно снизить производительность.
✔️ Используйте "\n" вместо std::endl, чтобы избежать ненужного сброса буфера и ускорить вывод.
👩💻
@quizcpp
В C++ std::endl не просто переносит строку, но также принудительно сбрасывает буфер вывода, что замедляет выполнение кода в циклах. При частом использовании в больших программах это может значительно снизить производительность.
✔️ Используйте "\n" вместо std::endl, чтобы избежать ненужного сброса буфера и ускорить вывод.
👩💻
@quizcpp
⚙️ std::optional
Класс std::optional предоставляет удобный способ работы с значениями, которые могут отсутствовать. Вместо использования "магических" значений (например, -1 или nullptr) или исключений, std::optional явно указывает на наличие или отсутствие данных.
👩💻
@quizcpp
Класс std::optional предоставляет удобный способ работы с значениями, которые могут отсутствовать. Вместо использования "магических" значений (например, -1 или nullptr) или исключений, std::optional явно указывает на наличие или отсутствие данных.
👩💻
@quizcpp
⚙️ std::span
std::span из заголовка (C++20) представляет собой некопируемый, безопасный для диапазонов представление массива. Он удобен для работы с массивами, векторами и буферами без создания лишних копий.
👩💻
@quizcpp
std::span из заголовка (C++20) представляет собой некопируемый, безопасный для диапазонов представление массива. Он удобен для работы с массивами, векторами и буферами без создания лишних копий.
👩💻
@quizcpp
⚙️ std::atomic_ref
std::atomic_ref из заголовка (C++20) позволяет работать с существующей переменной как с атомарной без копирования. Это полезно в многопоточных программах, когда нужно безопасно обновлять данные без защиты мьютексами.
👩💻
@quizcpp
std::atomic_ref из заголовка (C++20) позволяет работать с существующей переменной как с атомарной без копирования. Это полезно в многопоточных программах, когда нужно безопасно обновлять данные без защиты мьютексами.
👩💻
@quizcpp
⚙️ std::mdspan
std::mdspan из заголовка (C++23) — это многомерный представляемый вид массива, который позволяет безопасно работать с данными без копирования. Это мощный инструмент для работы с матрицами, тензорами и буферами.
👩💻
@quizcpp
std::mdspan из заголовка (C++23) — это многомерный представляемый вид массива, который позволяет безопасно работать с данными без копирования. Это мощный инструмент для работы с матрицами, тензорами и буферами.
👩💻
@quizcpp
⚙️ std::atomic_wait / std::atomic_notify_one
Методы std::atomic_wait и std::atomic_notify_one (C++20) позволяют эффективно синхронизировать потоки без активного ожидания (busy-waiting). Они приостанавливают выполнение потока, пока значение атомарной переменной не изменится.
👩💻
@quizcpp
Методы std::atomic_wait и std::atomic_notify_one (C++20) позволяют эффективно синхронизировать потоки без активного ожидания (busy-waiting). Они приостанавливают выполнение потока, пока значение атомарной переменной не изменится.
👩💻
@quizcpp
⚙️ std::stop_token
std::stop_token из (C++20) предоставляет механизм мягкой остановки потоков, позволяя безопасно завершать их работу без принудительного прерывания. Это удобная альтернатива std::atomic или std::condition_variable для управления потоками.
👩💻
@quizcpp
std::stop_token из (C++20) предоставляет механизм мягкой остановки потоков, позволяя безопасно завершать их работу без принудительного прерывания. Это удобная альтернатива std::atomic или std::condition_variable для управления потоками.
👩💻
@quizcpp
🔥1
⚙️ std::format
Метод std::format из заголовка (C++20) предоставляет удобный способ форматирования строк, аналогичный printf, но с безопасностью типов и читаемым синтаксисом.
👩💻
@quizcpp
Метод std::format из заголовка (C++20) предоставляет удобный способ форматирования строк, аналогичный printf, но с безопасностью типов и читаемым синтаксисом.
👩💻
@quizcpp
🔥1
⚙️ std::scope_exit
std::scope_exit из заголовка (C++23) позволяет автоматически выполнять код при выходе из области видимости. Это полезно для освобождения ресурсов и отмены операций без try/catch.
👩💻
@quizcpp
std::scope_exit из заголовка (C++23) позволяет автоматически выполнять код при выходе из области видимости. Это полезно для освобождения ресурсов и отмены операций без try/catch.
👩💻
@quizcpp
🚫 Антипаттерн недели: Использование new и delete вместо smart pointers
В 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