Telegram Web
⚙️ Итератор std::move_iterator преобразует обычный итератор в итератор, который перемещает элементы вместо их копирования. Это особенно полезно при работе с контейнерами, содержащими "тяжелые" объекты, такие как std::string или std::vector, чтобы избежать лишних копирований.

👩‍💻
@quizcpp
🔥1
Вопрос на собеседовании

Как функционируют исключения без затрат в 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
🔥1
🚫 Антипаттерн недели: Использование endl вместо \n в циклах

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

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

👩‍💻
@quizcpp
👍1🔥1
⚙️ std::optional

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

👩‍💻
@quizcpp
🔥1
⚙️ std::hardware_constructive_interference_size и std::hardware_destructive_interference_size

Эти две константы из заголовка (C++17) предназначены для оптимизации размещения данных в памяти с целью предотвращения конфликтов кэш-линий процессора. Они применяются для выравнивания структур и переменных в многопоточных приложениях.

👩‍💻
@quizcpp
🔥1
⚙️ std::span

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

👩‍💻
@quizcpp
🔥1
⚙️ std::mdspan

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

👩‍💻
@quizcpp
👍1
⚙️ std::atomic_wait / std::atomic_notify_one

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

👩‍💻
@quizcpp
⚙️ std::scope_exit

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
🚫 Антипаттерн недели: Применение new и delete вместо умных указателей

В C++ ручное управление памятью с помощью new и delete может вызвать утечки памяти, неопределённое поведение и ошибки двойного освобождения.

✔️ Используйте std::unique_ptr или std::shared_ptr, которые автоматически освобождают ресурсы при выходе из области видимости.

👩‍💻
@quizcpp
👎1
⚙️ std::condition_variable

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

👩‍💻
@quizcpp
⚙️ std::identity

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
2025/07/11 23:24:54
Back to Top
HTML Embed Code: