Форум программистов, компьютерный форум 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) выполняется конструктор копирования класса T. Разве не должна вместо этого теперь переменная Data "указывать" на туже область памяти что и ссылка Element. Я всегда думал что при присвоении объекту ссылки на другой объект никаких... http://www.cyberforum.ru/cpp-beginners/thread850196.html
Двухмерный массив: Написать программу, указывающую для каждого вопроса проценты ответов «Да», «Нет», «не знаю» C++
В двухмерном массиве размером n x m хранятся результаты опроса n человек на m вопросов. Ответами на вопросы являются слова «Да», «Нет», «не знаю». Написать программу, указывающую для каждого вопроса проценты ответов «Да», «Нет», «не знаю»
C++ Работа с графикой
Здравствуйте, помогите разобраться с программой? в результате должны получиться различные графические объекты, перемещающиеся по прямым траекториям с разными случайными векторами скоростей. и возможность добавления и удаления объектов. вот все, что есть. программа не работает. #include <stdlib.h> #include <time.h> #include <grx20.h> #include <grxkeys.h> struct TPoint{ int x,y; int vx,...
C++ Сформировать массив по правилу http://www.cyberforum.ru/cpp-beginners/thread850176.html
программа формирования и вывода массива размером 6 на 3, каждые три последовательных элемента в строке которого составлены по следующему правилу: 1-й - равен удвоенному числу, введенному с клавиатуры; 2-й - равен квадрату суммы индексов предыдущего элемента; 3-й - равен остатку от деления индекса текущего элемента на 2
C++ Нужна проверка кода (система обмена сообщениями) есть код C++,компилируется в Mingw/bin при помощи g++. Данный код представляет собой систему обмена сообщениями. Идеальный случай,когда юзер не допускает ошибок при вводе регистрационных данных. проблема в написании проверки ввода этих самых данных #include "iostream" #include "locale.h" #include <string> #include <stdio.h> #include <stdlib.h> using namespace std; подробнее

Показать сообщение отдельно
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
27.04.2013, 18:57     std::move, rvalue reference
Здравствуйте! Недавно начал разбираться с новыми способами передачи аргументов. Прочитал около 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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 19:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru