Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / move конструктор и инициализация {} / 11 сообщений из 11, страница 1 из 1
04.10.2019, 15:00
    #39871698
teo609
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
move конструктор и инициализация {}
Код: plaintext
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.
57.
58.
59.
struct TestStruct
{
	static int defCtr, numCtr, cpyCtr, cpyEqr, movCtr, movEqr, dtr;
	
	int num; string str;
	
	TestStruct(int i) : num(i), str("number : " + to_string(i)) { numCtr++; }
	TestStruct() : num(-1), str("default") { defCtr++; }
	TestStruct(const TestStruct & rhs) { num = rhs.num; str = rhs.str; cpyCtr++; }
	TestStruct & operator = (const TestStruct & rhs)  { num = rhs.num; str = rhs.str; cpyEqr++; return *this; }
	TestStruct(TestStruct && rhs) noexcept { num = rhs.num; str.swap(rhs.str); movCtr++; }
	TestStruct& operator = (TestStruct && rhs) noexcept { num = rhs.num; str.swap(rhs.str); movEqr++; return *this; }
	~TestStruct() {	dtr++; }
	
	static string Report() { 
	    string ret = "defCtr: " + to_string(defCtr) + ", numCtr: "+ to_string(numCtr) + ", cpyCtr: " + to_string(cpyCtr) + ", cpyEqr: " + to_string(cpyEqr) + 
		    ". \n\r   movCtr: " + to_string(movCtr) + ", movEqr: " + to_string(movEqr) + ", dtr: " + to_string(dtr) + ".";
		defCtr = numCtr = cpyCtr = movCtr = cpyEqr = movEqr = dtr = 0;
		return ret;
	}
};

int TestStruct::defCtr = 0;
int TestStruct::numCtr = 0;
int TestStruct::cpyCtr = 0;
int TestStruct::movCtr = 0;
int TestStruct::cpyEqr = 0;
int TestStruct::movEqr = 0;
int TestStruct::dtr = 0;


int main()
{
    cout<<"Hello World\r\n";
    
    {
        deque <TestStruct> d1;
        d1.push_back(1);
        d1.push_back(2);
    }
    
    cout << "\r\nReport 1: " << TestStruct::Report();
    
    {
        deque <TestStruct> d2;
        d2.emplace_back(3);
        d2.emplace_back(4);
    }
    
    cout << "\r\nReport 2: " << TestStruct::Report();
    
    {
        deque <TestStruct> d3 { 5, 6 };
    }
    
    cout << "\r\nReport 3: " << TestStruct::Report();

    return 0;
}



Вывод программы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Hello World                                                                                                                                                                
                                                                                                                                                                           
Report 1: defCtr: 0, numCtr: 2, cpyCtr: 0, cpyEqr: 0.                                                                                                                      
   movCtr: 2, movEqr: 0, dtr: 4.                                                                                                                                           
Report 2: defCtr: 0, numCtr: 2, cpyCtr: 0, cpyEqr: 0.                                                                                                                      
   movCtr: 0, movEqr: 0, dtr: 2.                                                                                                                                           
Report 3: defCtr: 0, numCtr: 2,  cpyCtr: 2 , cpyEqr: 0.                                                                                                                      
   movCtr: 0, movEqr: 0, dtr: 4.                                                                                                                                           


Как можно модифицировать код, чтобы и при инициализации 3м способом не вызывался конструктор копирования?
...
Рейтинг: 0 / 0
04.10.2019, 15:24
    #39871713
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
move конструктор и инициализация {}
Собирать с -O3 пробовал?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.10.2019, 15:29
    #39871717
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
move конструктор и инициализация {}
begin and end for initializer_list return const T *, so the result of move in your code is T const && — an immutable rvalue reference. Such an expression can't meaningfully be moved from. It will bind to an function parameter of type T const & because rvalues do bind to const lvalue references, and you will still see copy semantics.

https://stackoverflow.com/questions/8193102/initializer-list-and-move-semantics
...
Рейтинг: 0 / 0
04.10.2019, 15:42
    #39871723
teo609
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
move конструктор и инициализация {}
Cerebrum, спасибо.

Dimitry Sibiryakov, с О3 не пробовал. Пробовал на MS VS 2015 и в онлайне.
...
Рейтинг: 0 / 0
04.10.2019, 15:54
    #39871734
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
move конструктор и инициализация {}
Даже после прочтения Мейерса до конца не разобрался с семантикой перемещения с этими универсальными ссылками, rvalue и lvalue. Но мне казалось нельзя применить семантику перемещения даже от "константы", не то что initializer_list от "констант".
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
TestStruct ts1 (std::move(4));
logDebug("%s", TestStruct::Report().c_str());

TestStruct ts2 (std::move(ts1));
logDebug("%s", TestStruct::Report().c_str());

const TestStruct ts3 (std::move(1));
logDebug("%s", TestStruct::Report().c_str());

TestStruct ts4 (std::move(ts3));
logDebug("%s", TestStruct::Report().c_str());

Код: plaintext
1.
2.
3.
4.
defCtr: 0, numCtr: 1, cpyCtr: 0, cpyEqr: 0 movCtr: 0, movEqr: 0, dtr: 0.
defCtr: 0, numCtr: 0, cpyCtr: 0, cpyEqr: 0 movCtr: 1, movEqr: 0, dtr: 0.
defCtr: 0, numCtr: 1, cpyCtr: 0, cpyEqr: 0 movCtr: 0, movEqr: 0, dtr: 0.
defCtr: 0, numCtr: 0, cpyCtr: 1, cpyEqr: 0 movCtr: 0, movEqr: 0, dtr: 0.
...
Рейтинг: 0 / 0
04.10.2019, 16:03
    #39871739
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
move конструктор и инициализация {}
AmKadНо мне казалось нельзя применить семантику перемещения даже от "константы", не то что initializer_list от "констант".
для константы нельзя,
но 4 - это не простая константа, это, в первую очередь, - лексема
...
Рейтинг: 0 / 0
04.10.2019, 16:07
    #39871744
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
move конструктор и инициализация {}
Cerebrumно 4 - это не простая константа, это, в первую очередь, - лексемаЯ взял слово константа в кавычки с тем умыслом, что, как мне кажется, операция перемещения подразумевает возможность/необходимость покопаться скальпелем в кишках перемещаемого объекта. Константа же, как и лексема, как мне кажется, такой возможности не подразумевают. Поправьте меня, если я не прав.
...
Рейтинг: 0 / 0
04.10.2019, 16:14
    #39871748
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
move конструктор и инициализация {}
Хотя, скорее всего, я кое-что напутал. Лексема здесь - не объект, а всего лишь параметр конструктора.
...
Рейтинг: 0 / 0
07.10.2019, 02:24
    #39872378
a.guest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
move конструктор и инициализация {}
Cerebrumно 4 - это не простая константаЭто вообще не константа. Тип выражения `4` — `int`. Не `const int`.
...
Рейтинг: 0 / 0
08.10.2019, 22:13
    #39873644
teo609
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
move конструктор и инициализация {}
Вспомнил, откуда взялся эксперимент. Смотрел лекцию
[spoiler]
YouTube Video
...
Рейтинг: 0 / 0
09.10.2019, 08:26
    #39873724
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
move конструктор и инициализация {}
[spoiler]
YouTube Video
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / move конструктор и инициализация {} / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]