|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
Привет. Есть такое (обрезал и упростил как мог): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
При компиляции MSVC с уровнем оптимизации O2 исчезает вызов memcpy. А чего это он? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Вот ссылка на онлайн компилятор, если кто хочет: ссылка на godbolt ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2019, 22:49 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
кстати, memmove не оптимизируется. он предполагает что две эти области памяти могут пересекаться? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2019, 22:53 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
Ты проверь лучше какая польза от копирования. Это же твой код - занчит проверить можно. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 02:09 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
Веселее, когда цикл заменяется на memcpy, а приложение собирается без рантайма ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 06:26 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
oleqieкстати, memmove не оптимизируется. он предполагает что две эти области памяти могут пересекаться? Совершенно верно, и в документации это явно указано. Собственно, этим memove() и отличается от memcpy(). В некоторых компиляторах есть опция "разрешить длинные инлайны", которая и memmove развернёт "на месте", когда лимит на длину результата развёртывания будет увеличен настолько, что в него влезет не только memcpy(), а и обе ветки memmove(). ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 07:30 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
mayton, что значит какая польза? без копирования строчки не объединяются, результат не правильный. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 08:44 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
iv_an_ru, а с чего это вдруг он решил что области пересекаются? одна из них - глобальная переменная объявленная в другом месте, другая - опять-таки внешняя функция возвращающая хоть что. если мыслить таким образом, можно вообще все вызовы memcpy повыкидывать отовсюду... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 08:48 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
oleqiemayton, что значит какая польза? без копирования строчки не объединяются, результат не правильный. Ты девтестил? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 12:52 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
maytonoleqiemayton, что значит какая польза? без копирования строчки не объединяются, результат не правильный. Ты девтестил? Хватит выгораживать майкрософт. Это явный баг. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 13:09 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
OoCcmaytonпропущено... Ты девтестил? Хватит выгораживать майкрософт. Это явный баг. В майкрософт работают колдуны и маги. Как-тож оно сцуко работает ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 13:22 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
mayton, еще раз, от вызова memcpy польза есть, от твоих сообщений тут - нет :) я бы понял, если б это был результат глобальной оптимизации, на этапе линковки (да и то, в данном случае это неправильно - области памяти не пересекаются), но это результат компиляции одинокого файла ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 13:51 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
oleqie, Кстати, если сделать так Код: plaintext 1.
то memcpy появляется. Это скорее всего баг оптимизатора. Он считает массив одноэлементным, а значит по его мнению там UB от переполнения (как минимум 2 элемента массива адресуются). А раз UB - то делай что хочешь ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 14:13 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
oleqie, Рекомендую задать этот вопрос на stackoverflow - там ответят по существу, кроме того там иногда разрабы компиляторов тусуются, так что это может даже ускорить фикс, если это баг, а не описанное в стандарте поведение. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 14:16 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
Anatoly Moskovskyoleqie, Рекомендую задать этот вопрос на stackoverflow - там ответят по существу, кроме того там иногда разрабы компиляторов тусуются, так что это может даже ускорить фикс, если это баг, а не описанное в стандарте поведение. +1 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 14:20 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
У MSVS компилятора, что-то очень часто последнее время баги в продакшне выскакивают, начиная с повреждения стека и заканчивая банальным internal compiler error или старым добрым крэшем драйвера компилятора. Либо это связано с переходом на 2017 студию, которая, кстати, обновляется регулярно, либо MS начал брать в штат компилер девов совсем отбитых индусов. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 14:21 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
oleqieПри компиляции MSVC с уровнем оптимизации O2 исчезает вызов memcpy. А чего это он? интринсики... Чем ты недоволен? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 15:03 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, про размер я знаю, от 2 он его не вырезает. более того, если вместо внешнего массива неизвестного размера использовать внешний указатель (extern unsigned char *buffer;), memcpy тоже не будет вырезан. т.е. оптимизатор считает что это массив нулевого размера или размера 1, т.к. он все же пишет в него значение len а теперь, самое смешное (про МС и последнее время): изначально у меня это воспроизвелось на VS2005, это на godbolt-e не оказалось просто таких старперских компиляторов. обнаружив то же самое на свежих, подумал, что может это у меня тут где UB, а я его не вижу... попробую, наверное, на переполненномстеке повопрошать, на досуге, ибо какое-то неприятное это явление ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 15:10 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
MasterZiv, и причем тут интринсик? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 15:16 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
NekZЛибо это связано с переходом на 2017 студию, которая, кстати, обновляется регулярно, либо MS начал брать в штат компилер девов совсем отбитых индусов. Это связано с тем, что на подходе 2019 студия и надо показать, как все плохо в 2017, а в 2019 все круто. Скорее покупай 2019 студию! ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 15:42 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
CerebrumNekZЛибо это связано с переходом на 2017 студию, которая, кстати, обновляется регулярно, либо MS начал брать в штат компилер девов совсем отбитых индусов. Это связано с тем, что на подходе 2019 студия и надо показать, как все плохо в 2017, а в 2019 все круто. Скорее покупай 2019 студию! Не, это значит, что пора переходить на ICC. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 16:35 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
oleqieпопробую, наверное, на переполненномстеке повопрошать, на досуге И сюда ссылку на вопрос. Нам же тоже досуг нужен )) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 17:33 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
а вообще допустимо ли по стандарту ? Код: plaintext 1.
Потому что если запросить sizeof buffer, получаем warning C4034: sizeof returns 0 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 20:46 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
Siemargl, Допустимо. А sizeof buffer естественно недоступен. Но его никто и не пытался вычислять. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2019, 23:16 |
|
зачем MSVC соптимизировал memcpy?
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, Вот ссылка на вопрос: вопрос В целом, решили что это косяк компилятора, хотя никаких разработчиков компиляторов там не появилось :) Нашли похожий репорт: вот этот репорт - очень похоже, но репортер уверяет что появилось это с VS2017, а в 2015 все было хорошо. Ну я использовал воркэраунд с явным указанием размера массивов при их внешнем объявлении, в общем-то, сделал это еще до того как начал вопросы задавать, хотя это и не нравится. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2019, 10:22 |
|
|
start [/forum/topic.php?fid=57&msg=39793325&tid=2017644]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
others: | 265ms |
total: | 412ms |
0 / 0 |