Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > непонятки с move semantics


Автор: S.A.P. 27.3.2013, 04:39
Пытаюсь въехать в С++11. Запускаю такой код
Код
using namespace std;
string s1 ("123");
cout << hex << (void*)&s1[0] << endl;
string s2 (move(s1));
cout << hex << (void*)&s2[0] << endl;

Выводит разные оффсеты для внутреннего хранилища строк. Но почему?! Разве конструктор перемещения не должен там както хитро указатели подменить вместо копирования строк или я чегото не понял?

Компилю на VC11

Автор: S.A.P. 27.3.2013, 05:26
Вроде разобрался. Оказывается короткие строки до 16 символов копируются в новое расположение, даже при вызове конструктора перемещения. 
Кстати забавно компилятор решил, что такой тупой код быстрее копирования одного указателя
Код
00E45E6C   > \8B448E E4     MOV EAX,DWORD PTR DS:[ESI+ECX*4-1C]
00E45E70   .  89448F E4     MOV DWORD PTR DS:[EDI+ECX*4-1C],EAX
00E45E74   >  8B448E E8     MOV EAX,DWORD PTR DS:[ESI+ECX*4-18]
00E45E78   .  89448F E8     MOV DWORD PTR DS:[EDI+ECX*4-18],EAX
00E45E7C   >  8B448E EC     MOV EAX,DWORD PTR DS:[ESI+ECX*4-14]
00E45E80   .  89448F EC     MOV DWORD PTR DS:[EDI+ECX*4-14],EAX
00E45E84   >  8B448E F0     MOV EAX,DWORD PTR DS:[ESI+ECX*4-10]
00E45E88   .  89448F F0     MOV DWORD PTR DS:[EDI+ECX*4-10],EAX
00E45E8C   >  8B448E F4     MOV EAX,DWORD PTR DS:[ESI+ECX*4-C]
00E45E90   .  89448F F4     MOV DWORD PTR DS:[EDI+ECX*4-C],EAX
00E45E94   >  8B448E F8     MOV EAX,DWORD PTR DS:[ESI+ECX*4-8]
00E45E98   .  89448F F8     MOV DWORD PTR DS:[EDI+ECX*4-8],EAX
00E45E9C   >  8B448E FC     MOV EAX,DWORD PTR DS:[ESI+ECX*4-4]
00E45EA0   .  89448F FC     MOV DWORD PTR DS:[EDI+ECX*4-4],EAX

 smile 

Автор: borisbn 27.3.2013, 06:41
http://ideone.com/VvKBCS
Как видишь, зависит от реализации

Автор: volatile 27.3.2013, 17:34
Цитата(S.A.P. @  27.3.2013,  05:26 Найти цитируемый пост)
компилятор решил, что такой тупой код быстрее копирования одного указателя

Все правильно.
Это особенности студийной std::string
Там короткие строки храняцца внутри самой std::string, без выделения дополнительной памяти, поэтому копирование указателей
не имеет смысла.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)