Size: a a a

2021 February 11

MK

Mikhail Kalugin in pro.cxx
Danya
Только нафиг он нужен был бы
Меньше места в памяти занимает (в ноде один указатель вместо двух)
источник

D

Danya in pro.cxx
Mikhail Kalugin
Меньше места в памяти занимает (в ноде один указатель вместо двух)
Я думаю это очень редкий кейс для оптимизации
источник

D

Dmitriy in pro.cxx
Danya
Я думаю это очень редкий кейс для оптимизации
unordered map
источник

D

Daniel in pro.cxx
Всем привет.
Такой вопрос (скорее теоретический, чем практический): что будет работать быстрее
std::cout << 'Z';
или
std::cout << "Z";
? Всегда думал, что первый вариант в итоге должен быть быстрее.
Такой код:
void p1() {
   std::cout << 'Z';
}

void p2() {
   std::cout << "Z";
}

даёт такой выхлоп в g++ c флагом -O3:
p1():
       sub     rsp, 24
       mov     edx, 1
       mov     edi, OFFSET FLAT:_ZSt4cout
       lea     rsi, [rsp+15]
       mov     BYTE PTR [rsp+15], 90
       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)
       add     rsp, 24
       ret
.LC0:
       .string "Z"
p2():
       mov     edx, 1
       mov     esi, OFFSET FLAT:.LC0
       mov     edi, OFFSET FLAT:_ZSt4cout
       jmp     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)

В обоих случаях, как оказывается, вызывается одна и та же функция под капотом. Но в случае с выводом строкового литерала вызывается 1 процессорная команда для задания аргумента строки, которую нужно вывести, а в случае с символом — 2: подгужаем адрес в регистр и ставим по этому адресу значение символа.
Будет ли в итоге std::cout.put('Z') работать быстрее всех?
источник

S

Stas in pro.cxx
@das_3sz3tt , ты сломался?
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Ага
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Daniel
Всем привет.
Такой вопрос (скорее теоретический, чем практический): что будет работать быстрее
std::cout << 'Z';
или
std::cout << "Z";
? Всегда думал, что первый вариант в итоге должен быть быстрее.
Такой код:
void p1() {
   std::cout << 'Z';
}

void p2() {
   std::cout << "Z";
}

даёт такой выхлоп в g++ c флагом -O3:
p1():
       sub     rsp, 24
       mov     edx, 1
       mov     edi, OFFSET FLAT:_ZSt4cout
       lea     rsi, [rsp+15]
       mov     BYTE PTR [rsp+15], 90
       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)
       add     rsp, 24
       ret
.LC0:
       .string "Z"
p2():
       mov     edx, 1
       mov     esi, OFFSET FLAT:.LC0
       mov     edi, OFFSET FLAT:_ZSt4cout
       jmp     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)

В обоих случаях, как оказывается, вызывается одна и та же функция под капотом. Но в случае с выводом строкового литерала вызывается 1 процессорная команда для задания аргумента строки, которую нужно вывести, а в случае с символом — 2: подгужаем адрес в регистр и ставим по этому адресу значение символа.
Будет ли в итоге std::cout.put('Z') работать быстрее всех?
К тому же jmp значительно лучше call
источник

DF

Dollar Føølish in pro.cxx
Тем что не пушит адрес возврата ?
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Dollar Føølish
Тем что не пушит адрес возврата ?
Да
источник

DF

Dollar Føølish in pro.cxx
А, понял, спасибо
источник

D

Daniel in pro.cxx
Artöm Bakri Al-Sarmini
К тому же jmp значительно лучше call
Согласен.
Я правильно понимаю, что он в 1м случае выбирает call только потому, что ему после этого call нужно будет почистить стек? На ровном месте какая-то совсем "деоптимизация" получается из-за одного байта. Все из-за того, что идет вызов неправильный std::__ostream_insert, вместо std::ostream::put (или чего-то вроде этого)
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Daniel
Согласен.
Я правильно понимаю, что он в 1м случае выбирает call только потому, что ему после этого call нужно будет почистить стек? На ровном месте какая-то совсем "деоптимизация" получается из-за одного байта. Все из-за того, что идет вызов неправильный std::__ostream_insert, вместо std::ostream::put (или чего-то вроде этого)
Да
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Я не стдписатель, так что причину не скажу
источник

D

Daniel in pro.cxx
Artöm Bakri Al-Sarmini
Я не стдписатель, так что причину не скажу
тут скорее к писателям gcc, ведь, конечно перегрузка разная выбирается. вот только если включить -O3, то получается так как получилось)
источник

AS

Anatoly Shirokov in pro.cxx
Daniel
тут скорее к писателям gcc, ведь, конечно перегрузка разная выбирается. вот только если включить -O3, то получается так как получилось)
@antoshkka Антон обычно следил за багами оптимизатора gcc, только на godbolt подготовь пример.
источник

IZ

Ilia Zviagin in pro.cxx
Всё ясно
источник

S

SupaproBot in pro.cxx
Всем привет! Нужно подключить shape_predictor_68_face_landmarks.dat.bz2 к проекту Visual Studio (натренированная модель для определения поинтов на лице)
Как это сделать?

Вот оригинальная статья, там не сказано как это провернуть http://dlib.net/face_landmark_detection_ex.cpp.html
источник

IZ

Ilia Zviagin in pro.cxx
Переслано от Aidar Fattakhov
bz2 это архив
источник

IZ

Ilia Zviagin in pro.cxx
Переслано от Aidar Fattakhov
распакуй
источник

IZ

Ilia Zviagin in pro.cxx
Переслано от Aidar Fattakhov
будет .dat
источник