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

std::move, rvalue reference - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Ломбард - вывод табличных данных http://www.cyberforum.ru/cpp-beginners/thread850210.html
Помогите сделать таблицу. Плыз) #include <iostream> #include <fstream> #include <string.h> #include <windows.h> #include <iomanip> using namespace std; const int SZ=1;
C++ По поводу ссылок и конструктора копирования Никак не пойму. При создании объекта и передачи конструктору в качестве параметра объекта другого класса, отладчик показывает что на строчке Data(Element) выполняется конструктор копирования класса... http://www.cyberforum.ru/cpp-beginners/thread850196.html
Двухмерный массив: Написать программу, указывающую для каждого вопроса проценты ответов «Да», «Нет», «не знаю» C++
В двухмерном массиве размером n x m хранятся результаты опроса n человек на m вопросов. Ответами на вопросы являются слова «Да», «Нет», «не знаю». Написать программу, указывающую для каждого...
C++ Работа с графикой
Здравствуйте, помогите разобраться с программой? в результате должны получиться различные графические объекты, перемещающиеся по прямым траекториям с разными случайными векторами скоростей. и...
C++ Сформировать массив по правилу http://www.cyberforum.ru/cpp-beginners/thread850176.html
программа формирования и вывода массива размером 6 на 3, каждые три последовательных элемента в строке которого составлены по следующему правилу: 1-й - равен удвоенному числу, введенному с...
C++ Нужна проверка кода (система обмена сообщениями) есть код C++,компилируется в Mingw/bin при помощи g++. Данный код представляет собой систему обмена сообщениями. Идеальный случай,когда юзер не допускает ошибок при вводе регистрационных данных.... подробнее

Показать сообщение отдельно
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832

std::move, rvalue reference - C++

27.04.2013, 18:57. Просмотров 1112. Ответов 6
Метки (Все метки)

Здравствуйте! Недавно начал разбираться с новыми способами передачи аргументов. Прочитал около 10 статей, некоторые на русском, некоторые на английском. Но осталось несколько вопросов...
Помогите разобраться.
Допустим есть класс:
C++
1
2
3
4
5
6
class Foo
{
public:
    Foo( vector<string> v): vec( v ) {}
    vector<string> vec;
};
В главной функции я создаю вектор строк и заполняю его данными для того что бы передать его в конструктор (и больше вектор мне не нужен).
C++
1
2
3
4
5
6
7
8
9
int main()
{
    vector<string> s;
    s.push_back("string 1");
    s.push_back("string 2");
    Foo f( move(s) );
    cout << boolalpha << s.empty(); //вывод true - вектор пустой, значит данные переместились
    return 0;
}
Ставиться вопрос: сколько копирований вектора происходит во время выполнения
C++
1
Foo f( move(s) );
Одно копирование? move(s) переместил содержимое в параметр конструктора v, а после из v содержимое скопировалось в член класса vec.

И еще взгляните на почти аналогичный код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Foo
{
public:
    Foo( vector<string> v): vec( move(v) ) {} //сюда я добавил move
    vector<string> vec;
};
 
int main()
{
    vector<string> s;
    s.push_back("string 1");
    s.push_back("string 2");
    Foo f( s );
    cout << boolalpha << s.empty(); //на выводе false, то есть было два копирования (из s в v и из v в vec)
    return 0;
}
И такой вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <utility>
#include <vector>
 
using namespace std;
 
class Foo
{
public:
    Foo( vector<string> v): vec( move(v) ) {} //добавил move
    vector<string> vec;
};
 
int main()
{
    vector<string> s;
    s.push_back("string 1");
    s.push_back("string 2");
    Foo f( move(s) ); //добавил move
    cout << boolalpha << s.empty(); //на выводе true
    return 0;
}
То есть, в последнем варианте не было копирования вообще?
Компилятор MinGW 4.7.3
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru