С++ задачи и вопросы
561 subscribers
543 photos
4 files
200 links
Задачи, тесты и теоретические вопросы по С++

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
Download Telegram
⚙️ std::atomic_flag

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

👩‍💻

@quizcpp
Вопрос на собеседовании

Что такое constexpr в C++ и в чём его отличие от const?

Ответ ⬇️
constexpr — это спецификатор в C++, который указывает, что значение выражения или функции может быть вычислено на этапе компиляции, если это возможно. В отличие от const, который просто запрещает изменение значения, constexpr гарантирует, что вычисления происходят на этапе компиляции (при условии, что все входные данные известны на этом этапе).

constexpr используется для оптимизации кода, особенно в вычислениях, которые можно заранее предсказать.

Пример использования ⚙️
#include

constexpr int square(int x) {
return x * x; // Вычисляется на этапе компиляции
}

int main() {
constexpr int result = square(5); // Результат вычислен на этапе компиляции
std::cout

@quizcpp
⚙️ std::chrono::steady_clock

std::chrono::steady_clock из заголовка представляет часы с монотонным ходом, которые никогда не корректируются. Это полезно для измерения времени выполнения или задержек.

👩‍💻

@quizcpp
🔥1
⚙️ std::barrier

std::barrier из заголовка (доступно с C++20) синхронизирует выполнение потоков, ожидая, пока все участники не достигнут определённой точки (барьера). Это полезно для координации действий в многопоточных приложениях.

👩‍💻

@quizcpp
⚙️ std::monostate

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
⚙️ std::move_iterator

Итератор 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
🚫 Антипаттерн недели: Использование endl вместо \n в циклах

В C++ std::endl не просто переносит строку, но также принудительно сбрасывает буфер вывода, что замедляет выполнение кода в циклах. При частом использовании в больших программах это может значительно снизить производительность.

✔️ Используйте "\n" вместо std::endl, чтобы избежать ненужного сброса буфера и ускорить вывод.

👩‍💻

@quizcpp
⚙️ std::optional

Класс std::optional предоставляет удобный способ работы с значениями, которые могут отсутствовать. Вместо использования "магических" значений (например, -1 или nullptr) или исключений, std::optional явно указывает на наличие или отсутствие данных.

👩‍💻

@quizcpp
⚙️ std::span

std::span из заголовка (C++20) представляет собой некопируемый, безопасный для диапазонов представление массива. Он удобен для работы с массивами, векторами и буферами без создания лишних копий.

👩‍💻

@quizcpp
⚙️ std::atomic_ref

std::atomic_ref из заголовка (C++20) позволяет работать с существующей переменной как с атомарной без копирования. Это полезно в многопоточных программах, когда нужно безопасно обновлять данные без защиты мьютексами.

👩‍💻

@quizcpp
⚙️ std::mdspan

std::mdspan из заголовка (C++23) — это многомерный представляемый вид массива, который позволяет безопасно работать с данными без копирования. Это мощный инструмент для работы с матрицами, тензорами и буферами.

👩‍💻

@quizcpp
⚙️ std::atomic_wait / std::atomic_notify_one

Методы std::atomic_wait и std::atomic_notify_one (C++20) позволяют эффективно синхронизировать потоки без активного ожидания (busy-waiting). Они приостанавливают выполнение потока, пока значение атомарной переменной не изменится.

👩‍💻

@quizcpp