Size: a a a

cxx.Дискуссионная

2020 April 12

D

Danya in cxx.Дискуссионная
Сделай скрин
источник

D

Danya in cxx.Дискуссионная
Я с телефона
источник

D

Danya in cxx.Дискуссионная
Может скажу что-то умное
источник

D

Danya in cxx.Дискуссионная
Danya
Сделай скрин
Желательно всего кода или почти всего
источник

0

0xFF in cxx.Дискуссионная
Till Schneider
Пусть расскажет, как им пользоваться на смартфоне
:D
источник

G

GNU/Плюшка in cxx.Дискуссионная
Roy Mustang
так, а строка 41 и 42 чем заняты?
хренью какой-то
в любом случае на 55 строке у тебя вызывается ostream_insert, у которого второй аргумент - указатель на буфер
а второй аргумент (RSI) как раз и указывает на rsp+16, то есть на стек
источник

G

GNU/Плюшка in cxx.Дискуссионная
значит и строка лежит на стеке
источник

RM

Roy Mustang in cxx.Дискуссионная
Что то ты путаешь
источник

RM

Roy Mustang in cxx.Дискуссионная
Дай я гляну щас
источник

D

Danya in cxx.Дискуссионная
Я думаю он прав
источник

G

GNU/Плюшка in cxx.Дискуссионная
mov     rsi, QWORD PTR [rsp+16]
       call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
источник

RM

Roy Mustang in cxx.Дискуссионная
По регистрам раскидываются адреса стеков: [rsp+8], [rsp+16], [rsp+32]
По адресу [rsp+8] лежит у нас размер, а не объект (размер строки)
По адресу [rsp+16] лежит адрес name скорее всего
Потом инициализируется basic_string
Затем в RDX помещается значение из указателя по [rsp+8] (размер строки)
Затем в регистр xmm0 кладется .LC0 (которое по сути кусок твоего слова представленное в виде значения чтоб соптимизировать скорее всего)
Затем в RCX кладется таким же лайфхаком но уже напрямую магическое число "7881616507232526450", которое тоже кусок слова представленное в виде значения
По адресу [rsp+16] кладется RAX (это name поле)
По адресу [rsp+32] кладется RDX (он же размер строки)
Потом в регистр EDX кладется 29797, это тоже кусок слова
Потом происходит следующее: movups  XMMWORD PTR [rax], xmm0
Ранее в xmm0 помещалось первая часть слова
Затем происходит следующее: mov     WORD PTR [rax+24], dx
Двойное слово из EDX помещается по адресу rax+24 (это где то середина name памяти)
Дальше я разбирать не стал, и так все понятно, так же по кускам собирается все слово, а затем вывод
источник

RM

Roy Mustang in cxx.Дискуссионная
Я не понял только чем занят call    std::__cxx11::basic_string
источник

RM

Roy Mustang in cxx.Дискуссионная
Он тупо аллоцирует размер походу
источник

RM

Roy Mustang in cxx.Дискуссионная
А строки уже затем подаются в аллоцированную память
источник

RM

Roy Mustang in cxx.Дискуссионная
А еще судя по годболту, нет разницы между foo&& и const foo& или const foo&&
источник

RM

Roy Mustang in cxx.Дискуссионная
на выходе
источник

RM

Roy Mustang in cxx.Дискуссионная
А  еще можно вот такую шляпу мутить
источник

RM

Roy Mustang in cxx.Дискуссионная
Не понял правда зачем и можно ли этим отстрелить  ногу - это уже к знатокам
источник

RM

Roy Mustang in cxx.Дискуссионная
я в этом нуль
источник