непонятки с move semantics

 
0
 
C++
ava
S.A.P. | 27.03.2013, 05: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
Kommentare (3)
ava
S.A.P. | 27.03.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 
ava
borisbn | 27.03.2013, 06:41 #
http://ideone.com/VvKBCS
Как видишь, зависит от реализации
ava
volatile | 27.03.2013, 17:34 #
Цитата (S.A.P. @  27.3.2013,  05:26 findReferencedText)
компилятор решил, что такой тупой код быстрее копирования одного указателя

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

Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden