Форум программистов, компьютерный форум, киберфорум
Наши страницы

Что такое move семантика? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как заполнить список (QListWidget) случайными числами? http://www.cyberforum.ru/cpp-beginners/thread1308730.html
Как заполнить список (QListWidget) случайными числами? Пробовал как-то так: srand(time(NULL)); int random_value = rand() % 100; list = new QListWidget(this); for (int counter = 0; counter <...
C++ Как это возможно сделать? Как это сделать на с++ http://www.cyberforum.ru/cpp-beginners/thread1308729.html
C++ Threads
Есть массив потоков в количестве 10 и есть функция, которую надлежит выполнить 50 раз, как этими 10-ю потоками выполнить её 50 раз?
C++ Моделирование изменения температуры твердого тела
Здравствуйте. Написал кусок кода, но почему-то он не хочет запускаться. Выдает "Build Filed". Код писал на Xcode. Заранее спасибо за помощь. #include <stdio.h> #include <stdlib.h> #include...
C++ Построчно разобрать код http://www.cyberforum.ru/cpp-beginners/thread1308723.html
Добрый вечер , помогите пожалуйста построчно разобрать сей код и исправьте , если я где то ошибся , пожалуйста: int *arr; //создаем указатель с именем arr bool *f; // создаем...
C++ Вычислить частичную сумму элементов массива [C] nm, зачеркнув средний столбик i строку Вычислить частичную сумму элементов массива nm, зачеркнув средний столбик i строку Помогите сделать программу, или подскажите как средний столбик и строку вычеркнуть, если матрица скажем 3 на 3. подробнее

Показать сообщение отдельно
hoggy
6691 / 2873 / 493
Регистрация: 15.11.2014
Сообщений: 6,465
Завершенные тесты: 1
23.11.2014, 21:46
Цитата Сообщение от taras atavin Посмотреть сообщение
Что такое move семантика?
Самое главное, что нужно понять: вы можете писать методы, которые различают "обычные объекты" (lvalue) и "временные" (rvalue)

Что такое временный объект? Это объект, который гарантированно не жилец.
А значит, в некоторых случаях, можно его опустошить, и тем самым оптимизировать создание объекта по его прототипу.

Покажу на примере:

http://rextester.com/JCQZS64854

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
using namespace std;
 
struct sample
{
    int* data;
    
    ~sample()
    {
        if(data)
            cout<<"delete object("<<*data<<")\n";
        else
            cout<<"delete empty object\n";
            
        
        delete data;
    }
    
    sample(const int v)
        : data( new int(v) )
    { cout<<"ctor("<<*data<<")\n"; }
    
    sample():data(nullptr) { cout<<"ctor\n"; }
    sample(const sample&)  { cout<<"copy\n"; }
    sample(sample&&     )  { cout<<"move\n"; }
    
    sample& operator=(const sample& rhs)
    {
        cout<<"copy operator=\n";
        data = new int(*rhs.data);
        return *this;
    }
    
    sample& operator=(sample&& rhs)
    {
        cout<<"move operator=\n";
        
        data = rhs.data;
        rhs.data = nullptr;
        return *this;
    }
};
 
sample foo()
{
    sample s(10);
    return s;
}
 
int main()
{
    std::cout << "Hello, world!\n";
    
    sample s;
    s = foo();
}
sample держит внутри себя указатель на данные в куче.

Если мы попытается сделать копию объекта - мы не можем просто скопировать указатель.
Мы должны сделать глубокую копию данных, или получим двойное удаление в диструкторе.

Но если мы заранее знаем, что создание объекта происходит по прототипу временного объекта, то мы можем "опустошить" временный объект: не делая глубокой копии данных, просто скопировать указатель, занулив его у временного объекта.

Таким образом осуществляются оптимизации создания объектов без необходимости выполнять глубокую копию.

--------------

Иногда бывают случаи, когда объект по факту не является временным.
Но вы совершенно уверены, что объект вам больше не нужен.

И тогда, вы можете использовать std::move, что бы явно подчеркнуть, что этот объект можно опустошать.
2
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru