Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 393новые вакансии за сутки·54 487вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 590
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 396 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python8 807
  • Облачные технологии6 651
  • QA вакансии2 171
  • Android1 317
  • Инженер данных867
  • Продакт-менеджер313

Разработка

  • iOS1 229
  • Backend вакансии1 199
  • AI вакансии548
  • Fullstack вакансии496
  • Frontend вакансии424
  • Mobile вакансии28

По стеку

  • Go5 239
  • Java3 132
  • Kotlin1 122
  • Node.js1 007
  • Rust852
  • .NET662
  • PHP319
  • C++268
  • C#207

DevOps и инфраструктура

  • Kubernetes3 912
  • Linux-инфраструктура2 845
  • DevOps вакансии2 680
  • Terraform / IaC2 177
  • Мониторинг и Observability1 072
  • CI/CD913
  • SRE307
  • Кибербезопасность34

Аналитика и данные

  • Аналитик данных528
  • Data Scientist433
  • Бизнес-аналитик399
  • Системный аналитик67

Другие направления

  • Проджект-менеджер105
  • UI/UX дизайн68
  • Ручное тестирование14

По регионам

  • Вакансии в США25 969
  • Вакансии в Европе10 359
  • Работа в России3 634
  • Вакансии в Канаде2 280

По формату

  • Удалённые вакансии42 910
  • Релокация в США25 969
  • Гибридная работа5 672
  • Офисная работа4 445

По уровню

  • Senior вакансии22 739
  • Middle вакансии11 602
  • Junior вакансии3 909

Сейчас нанимают

Все компании
  • Rakuten189 вакансий
  • Wise187 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis47 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме C++Все вопросы
C++MiddleКодинг

Что такое move constructor и оператор move assignment?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Move constructor (T&& other) и move assignment (operator=(T&&)) «крадут» ресурсы временного объекта, обнуляя источник. Обязательно noexcept — иначе std::vector при reallocate не использует move. После std::move объект в valid-but-unspecified состоянии.

Реализация move constructor и move assignment

#include <cstddef>
#include <utility>
#include <iostream>
#include <algorithm>

class Buffer {
public:
    // Конструктор
    explicit Buffer(std::size_t size)
        : data_(new int[size]), size_(size) {
        std::cout << "construct size=" << size << "\n";
    }

    // Деструктор
    ~Buffer() {
        delete[] data_;
        std::cout << "destroy size=" << size_ << "\n";
    }

    // Копирующий конструктор
    Buffer(const Buffer& other)
        : data_(new int[other.size_]), size_(other.size_) {
        std::copy(other.data_, other.data_ + size_, data_);
        std::cout << "copy size=" << size_ << "\n";
    }

    // Move constructor — «кражa» ресурсов
    Buffer(Buffer&& other) noexcept
        : data_(other.data_), size_(other.size_) {
        other.data_ = nullptr; // обнулить источник!
        other.size_ = 0;
        std::cout << "move construct\n";
    }

    // Copy assignment
    Buffer& operator=(const Buffer& other) {
        if (this != &other) {
            Buffer tmp(other); // copy-and-swap
            swap(tmp);
        }
        return *this;
    }

    // Move assignment
    Buffer& operator=(Buffer&& other) noexcept {
        if (this != &other) {
            delete[] data_;       // освободить свои ресурсы
            data_ = other.data_;  // украсть
            size_ = other.size_;
            other.data_ = nullptr; // обнулить источник
            other.size_ = 0;
        }
        std::cout << "move assign\n";
        return *this;
    }

    void swap(Buffer& other) noexcept {
        std::swap(data_, other.data_);
        std::swap(size_, other.size_);
    }

    std::size_t size() const noexcept { return size_; }

private:
    int*        data_;
    std::size_t size_;
};

int main() {
    Buffer a(100);
    Buffer b = std::move(a); // move constructor
    std::cout << "a.size=" << a.size() << "\n"; // 0 — a опустошён
    std::cout << "b.size=" << b.size() << "\n"; // 100

    Buffer c(50);
    c = std::move(b); // move assignment
    std::cout << "b.size=" << b.size() << "\n"; // 0
    std::cout << "c.size=" << c.size() << "\n"; // 100
}

Move семантика в C++: конструктор перемещения и move assignment

Move семантика, появившаяся в C++11, позволяет «украсть» ресурсы временного объекта вместо их дорогостоящего копирования. Это критично для классов, владеющих heap-памятью, файловыми дескрипторами или сетевыми соединениями.

Проблема до C++11

До C++11 передача объектов в функции и возврат из них всегда вызывали копирующий конструктор — даже если источник являлся временным объектом и сразу уничтожался.

Rvalue references

T&& — rvalue-ссылка, привязывается только к rvalue (временным объектам или результату std::move). Это позволяет перегружать конструктор и оператор присваивания специально для «переезжающих» объектов.

Rule of Five

Если класс явно определяет хотя бы один из: деструктор, copy constructor, copy assignment, move constructor, move assignment — нужно объявить все пять. Иначе компилятор может не сгенерировать нужные специальные функции автоматически.

noexcept обязателен для move

STL-контейнеры (vector, deque) используют move вместо copy только при reallocate, если move constructor помечен noexcept. Без noexcept вектор будет копировать элементы при росте — нивелируя весь выигрыш.

std::move не перемещает

std::move(x) — это просто cast к rvalue-ссылке. Само перемещение выполняет move constructor/assignment при вызове. После std::move объект находится в «valid but unspecified state» — можно только уничтожить или переназначить.

Когда компилятор генерирует move автоматически

Компилятор генерирует move constructor и move assignment, если класс не объявляет явно ни копирующих операций, ни деструктора. Объявление любого из них подавляет автогенерацию move.

Подводные камни

  • Забыть обнулить указатель в источнике: деструктор источника вызовет delete[] второй раз — double free.
  • Move constructor без noexcept: std::vector при resize будет копировать, а не перемещать — потеря производительности.
  • Использование перемещённого объекта: объект в «moved-from» состоянии имеет неопределённое значение — читать его опасно.
  • Self-move (a = std::move(a)): без проверки this != &other можно уничтожить свои данные раньше их кражи.
  • Move не всегда быстрее copy: для мелких trivially-copyable типов (int, double) компилятор оптимизирует оба пути одинаково.
  • Объявление деструктора блокирует автогенерацию move — нужно явно писать = default.
  • Передача по значению + std::move внутри (sink idiom) может дать лишнюю копию при передаче lvalue — иногда лучше две перегрузки.

Типичные ошибки

  • Объяснять move constructor и move assignment только по синтаксису, без жизненного цикла и стоимости.
  • Игнорировать ошибки, null/empty состояния, порядок инициализации или режим сборки.
  • Давать пример, который работает в демо, но ломается при изменении владельца ресурса.
  • Показывать сырой указатель без объяснения владельца и момента освобождения.

Что проверяет интервьюер

  • Кандидат формулирует точную модель для move constructor и move assignment, а не только определение.
  • Пример компилируем, безопасен по lifetime и соответствует версии технологии.
  • Названы trade-off, ограничения и диагностируемые симптомы ошибки.

Как вы знаете этот вопрос?

Проверить себя по теме C++ →

Источники

  • https://en.cppreference.com/w/cpp/language/move_constructor
  • https://en.cppreference.com/w/cpp/language/move_assignment
←Предыдущий вопросЧто такое чисто виртуальная функция (pure virtual function) и абстрактный класс?Следующий вопрос→Представьте, сервис на C++ стал медленнее или нестабильнее после релиза. Какие language/runtime-specific причины вы проверите?

Связанные темы

C++Debuggingmemory-managementperformance-tradeoffs

Вакансии с этим навыком

C++ вакансии
  • Senior C++ Software Engineer (#5819)
  • Principal Software Engineer (Remote Eligible in Bulgaria)
  • Стажёр-разработчик C++
  • Security Architect
  • Sr. Software Developer - C#/WPF for UI/UX Development

Частые вопросы на собеседовании

  • Что такое undefined behavior в C++ и приведите примеры?
  • Что такое smart pointers в C++? Объясните unique_ptr, shared_ptr и weak_ptr.
  • Что такое правило трёх / правило пяти / правило нуля (Rule of Three / Five / Zero)?
  • Что такое RAII (Resource Acquisition Is Initialization) и почему это важно?