❓ Вопрос на собеседовании
Что такое Placement new в C++ и как оно используется?
Ответ ⬇️
Placement new — это особая форма оператора new, которая позволяет размещать объект в заранее выделенной области памяти. Вместо того чтобы выделять память в куче, как делает обычный new, placement new создает объект по адресу, который передается в качестве аргумента.
Это используется для более точного контроля над памятью, например, в реализациях кастомных аллокаторов, пулах памяти или для повышения производительности в системах с ограниченными ресурсами.
Пример использования ⚙️
```cpp
#include <iostream>
#include <new> // Для 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 создает объект по адресу, который передается в качестве аргумента.
Это используется для более точного контроля над памятью, например, в реализациях кастомных аллокаторов, пулах памяти или для повышения производительности в системах с ограниченными ресурсами.
Пример использования ⚙️
```cpp
#include <iostream>
#include <new> // Для placement new
int main() {
alignas(alignof(int)) char buffer[sizeof(int)]; // Буфер для хранения объекта
int* ptr = new (buffer) int(42); // Размещение объекта в buffer
std::cout
```
@quizcpp
⚙️ std::assume_aligned
std::assume_aligned из заголовка (доступно с C++20) информирует компилятор о том, что указатель имеет заданное выравнивание. Это способствует оптимизации доступа к памяти, особенно в приложениях, требующих высокой производительности.
👩💻
@quizcpp
std::assume_aligned из заголовка (доступно с C++20) информирует компилятор о том, что указатель имеет заданное выравнивание. Это способствует оптимизации доступа к памяти, особенно в приложениях, требующих высокой производительности.
👩💻
@quizcpp
⚙️ std::execution::par_unseq
Метод std::execution::par_unseq из стандартной библиотеки C++17 дает возможность параллельно выполнять алгоритмы с применением многопоточности. Этот метод особенно эффективен при работе с большими объемами данных, поскольку он может существенно ускорить выполнение таких алгоритмов, как сортировка, фильтрация и преобразование.
👩💻
@quizcpp
Метод std::execution::par_unseq из стандартной библиотеки C++17 дает возможность параллельно выполнять алгоритмы с применением многопоточности. Этот метод особенно эффективен при работе с большими объемами данных, поскольку он может существенно ускорить выполнение таких алгоритмов, как сортировка, фильтрация и преобразование.
👩💻
@quizcpp
⚙️ std::filesystem::space
std::filesystem::space из заголовка предоставляет данные о свободном, занятом и общем пространстве на устройстве. Это полезно для отслеживания состояния файловой системы.
👩💻
@quizcpp
std::filesystem::space из заголовка предоставляет данные о свободном, занятом и общем пространстве на устройстве. Это полезно для отслеживания состояния файловой системы.
👩💻
@quizcpp
⚙️ Итератор std::move_iterator преобразует обычный итератор в итератор, который перемещает элементы вместо их копирования. Это особенно полезно при работе с контейнерами, содержащими "тяжелые" объекты, такие как std::string или std::vector, чтобы избежать лишних копирований.
👩💻
@quizcpp
👩💻
@quizcpp
❓ Вопрос на собеседовании
Как функционируют исключения без затрат в C++ и почему они считаются эффективными?
Ответ ⬇️
Исключения без затрат означают, что в процессе обычного выполнения программы исключения не оказывают влияния на производительность. Вместо проверок компилятор создает специальные таблицы (.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
Как функционируют исключения без затрат в C++ и почему они считаются эффективными?
Ответ ⬇️
Исключения без затрат означают, что в процессе обычного выполнения программы исключения не оказывают влияния на производительность. Вместо проверок компилятор создает специальные таблицы (.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::hardware_constructive_interference_size и std::hardware_destructive_interference_size
Эти две константы из заголовка (C++17) предназначены для оптимизации размещения данных в памяти с целью предотвращения конфликтов кэш-линий процессора. Они применяются для выравнивания структур и переменных в многопоточных приложениях.
👩💻
@quizcpp
Эти две константы из заголовка (C++17) предназначены для оптимизации размещения данных в памяти с целью предотвращения конфликтов кэш-линий процессора. Они применяются для выравнивания структур и переменных в многопоточных приложениях.
👩💻
@quizcpp
⚙️ std::span
std::span из заголовка (C++20) является некопируемым и безопасным для диапазонов представлением массива. Он удобен для работы с массивами, векторами и буферами без необходимости создания лишних копий.
👩💻
@quizcpp
std::span из заголовка (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) обеспечивают эффективную синхронизацию потоков без активного ожидания. Они приостанавливают работу потока до тех пор, пока значение атомарной переменной не изменится.
👩💻
@quizcpp
Методы std::atomic_wait и std::atomic_notify_one (C++20) обеспечивают эффективную синхронизацию потоков без активного ожидания. Они приостанавливают работу потока до тех пор, пока значение атомарной переменной не изменится.
👩💻
@quizcpp
⚙️ 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