❓ Вопрос на собеседовании
Что такое 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
Что такое 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
std::chrono::steady_clock из заголовка представляет часы с монотонным ходом, которые никогда не корректируются. Это полезно для измерения времени выполнения или задержек.
👩💻
@quizcpp
🔥1
⚙️ 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
