powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / move конструктор и инициализация {}
11 сообщений из 11, страница 1 из 1
move конструктор и инициализация {}
    #39871698
teo609
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
move конструктор и инициализация {}
    #39871713
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собирать с -O3 пробовал?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
move конструктор и инициализация {}
    #39871717
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
move конструктор и инициализация {}
    #39871723
teo609
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cerebrum, спасибо.

Dimitry Sibiryakov, с О3 не пробовал. Пробовал на MS VS 2015 и в онлайне.
...
Рейтинг: 0 / 0
move конструктор и инициализация {}
    #39871734
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже после прочтения Мейерса до конца не разобрался с семантикой перемещения с этими универсальными ссылками, 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
move конструктор и инициализация {}
    #39871739
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadНо мне казалось нельзя применить семантику перемещения даже от "константы", не то что initializer_list от "констант".
для константы нельзя,
но 4 - это не простая константа, это, в первую очередь, - лексема
...
Рейтинг: 0 / 0
move конструктор и инициализация {}
    #39871744
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumно 4 - это не простая константа, это, в первую очередь, - лексемаЯ взял слово константа в кавычки с тем умыслом, что, как мне кажется, операция перемещения подразумевает возможность/необходимость покопаться скальпелем в кишках перемещаемого объекта. Константа же, как и лексема, как мне кажется, такой возможности не подразумевают. Поправьте меня, если я не прав.
...
Рейтинг: 0 / 0
move конструктор и инициализация {}
    #39871748
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя, скорее всего, я кое-что напутал. Лексема здесь - не объект, а всего лишь параметр конструктора.
...
Рейтинг: 0 / 0
move конструктор и инициализация {}
    #39872378
a.guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cerebrumно 4 - это не простая константаЭто вообще не константа. Тип выражения `4` — `int`. Не `const int`.
...
Рейтинг: 0 / 0
move конструктор и инициализация {}
    #39873644
teo609
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вспомнил, откуда взялся эксперимент. Смотрел лекцию
[spoiler]
YouTube Video
...
Рейтинг: 0 / 0
move конструктор и инициализация {}
    #39873724
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[spoiler]
YouTube Video
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / move конструктор и инициализация {}
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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