powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / зачем MSVC соптимизировал memcpy?
25 сообщений из 28, страница 1 из 2
зачем MSVC соптимизировал memcpy?
    #39792641
oleqie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет. Есть такое (обрезал и упростил как мог):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <stdint.h>
#include <memory.h>

extern char buffer[];

extern void getstr1(char *buff, int buflen);
extern void getstr2(char **s);
extern void dosomething(char *s);

void myfn()
{
    char *s, *s1;
    int len;
    
    getstr1(buffer, 128);
    getstr2(&s);

    len = *s + *buffer;
    memcpy(buffer + *buffer + 1, s + 1, (*s) * sizeof(char));
    *buffer = len;
    
    dosomething(buffer);
}



При компиляции MSVC с уровнем оптимизации O2 исчезает вызов memcpy. А чего это он?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
_s$ = -4                                                ; size = 4
void myfn(void) PROC                                 ; myfn, COMDAT
        push    ecx
        push    128                           ; 00000080H
        push    OFFSET char * buffer             ; buffer
        call    void getstr1(char *,int)           ; getstr1
        lea     eax, DWORD PTR _s$[esp+12]
        push    eax
        call    void getstr2(char * *)                    ; getstr2
        mov     eax, DWORD PTR _s$[esp+16]
        push    OFFSET char * buffer             ; buffer
        mov     al, BYTE PTR [eax]
        add     BYTE PTR char * buffer, al
        call    void dosomething(char *)              ; dosomething
        add     esp, 20                             ; 00000014H
        ret     0
void myfn(void) ENDP                                 ; myfn



Вот ссылка на онлайн компилятор, если кто хочет: ссылка на godbolt
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39792643
oleqie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кстати, memmove не оптимизируется. он предполагает что две эти области памяти могут пересекаться?
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39792660
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты проверь лучше какая польза от копирования. Это же твой код - занчит проверить можно.
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39792673
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Веселее, когда цикл заменяется на memcpy,
а приложение собирается без рантайма
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39792687
Фотография iv_an_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleqieкстати, memmove не оптимизируется. он предполагает что две эти области памяти могут пересекаться?
Совершенно верно, и в документации это явно указано. Собственно, этим memove() и отличается от memcpy(). В некоторых компиляторах есть опция "разрешить длинные инлайны", которая и memmove развернёт "на месте", когда лимит на длину результата развёртывания будет увеличен настолько, что в него влезет не только memcpy(), а и обе ветки memmove().
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39792701
oleqie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

что значит какая польза? без копирования строчки не объединяются, результат не правильный.
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39792703
oleqie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iv_an_ru,

а с чего это вдруг он решил что области пересекаются? одна из них - глобальная переменная объявленная в другом месте, другая - опять-таки внешняя функция возвращающая хоть что. если мыслить таким образом, можно вообще все вызовы memcpy повыкидывать отовсюду...
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39792897
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleqiemayton,

что значит какая польза? без копирования строчки не объединяются, результат не правильный.
Ты девтестил?
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39792908
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonoleqiemayton,

что значит какая польза? без копирования строчки не объединяются, результат не правильный.
Ты девтестил?
Хватит выгораживать майкрософт. Это явный баг.
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39792913
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OoCcmaytonпропущено...

Ты девтестил?
Хватит выгораживать майкрософт. Это явный баг.
В майкрософт работают колдуны и маги. Как-тож оно сцуко работает
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39792928
oleqie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

еще раз, от вызова memcpy польза есть, от твоих сообщений тут - нет :)

я бы понял, если б это был результат глобальной оптимизации, на этапе линковки (да и то, в данном случае это неправильно - области памяти не пересекаются), но это результат компиляции одинокого файла
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39792941
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleqie,

Кстати, если сделать так
Код: plaintext
1.
extern char buffer[2]; // любое >1


то memcpy появляется.
Это скорее всего баг оптимизатора.
Он считает массив одноэлементным, а значит по его мнению там UB от переполнения (как минимум 2 элемента массива адресуются).
А раз UB - то делай что хочешь
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39792944
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleqie,

Рекомендую задать этот вопрос на stackoverflow - там ответят по существу, кроме того там иногда разрабы компиляторов тусуются, так что это может даже ускорить фикс, если это баг, а не описанное в стандарте поведение.
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39792946
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyoleqie,

Рекомендую задать этот вопрос на stackoverflow - там ответят по существу, кроме того там иногда разрабы компиляторов тусуются, так что это может даже ускорить фикс, если это баг, а не описанное в стандарте поведение.

+1
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39792948
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У MSVS компилятора, что-то очень часто последнее время баги в продакшне выскакивают, начиная с повреждения стека и заканчивая
банальным internal compiler error или старым добрым крэшем драйвера компилятора.
Либо это связано с переходом на 2017 студию, которая, кстати, обновляется регулярно, либо MS начал брать в штат компилер девов
совсем отбитых индусов.
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39792990
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleqieПри компиляции MSVC с уровнем оптимизации O2 исчезает вызов memcpy. А чего это он?


интринсики...

Чем ты недоволен?
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39792999
oleqie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,

про размер я знаю, от 2 он его не вырезает. более того, если вместо внешнего массива неизвестного размера использовать внешний указатель (extern unsigned char *buffer;), memcpy тоже не будет вырезан. т.е. оптимизатор считает что это массив нулевого размера или размера 1, т.к. он все же пишет в него значение len

а теперь, самое смешное (про МС и последнее время): изначально у меня это воспроизвелось на VS2005, это на godbolt-e не оказалось просто таких старперских компиляторов. обнаружив то же самое на свежих, подумал, что может это у меня тут где UB, а я его не вижу...

попробую, наверное, на переполненномстеке повопрошать, на досуге, ибо какое-то неприятное это явление
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39793008
oleqie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

и причем тут интринсик?
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39793036
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZЛибо это связано с переходом на 2017 студию, которая, кстати, обновляется регулярно, либо MS начал брать в штат компилер девов
совсем отбитых индусов.
Это связано с тем, что на подходе 2019 студия и надо показать, как все плохо в 2017, а в 2019 все круто. Скорее покупай 2019 студию!
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39793116
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CerebrumNekZЛибо это связано с переходом на 2017 студию, которая, кстати, обновляется регулярно, либо MS начал брать в штат компилер девов
совсем отбитых индусов.
Это связано с тем, что на подходе 2019 студия и надо показать, как все плохо в 2017, а в 2019 все круто. Скорее покупай 2019 студию!
Не, это значит, что пора переходить на ICC.
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39793183
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleqieпопробую, наверное, на переполненномстеке повопрошать, на досуге
И сюда ссылку на вопрос. Нам же тоже досуг нужен ))
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39793325
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вообще допустимо ли по стандарту ?
Код: plaintext
1.
extern unsigned char buffer[];



Потому что если запросить sizeof buffer, получаем warning C4034: sizeof returns 0
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39793359
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl,

Допустимо.

А sizeof buffer естественно недоступен. Но его никто и не пытался вычислять.
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39793441
oleqie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,

Вот ссылка на вопрос: вопрос

В целом, решили что это косяк компилятора, хотя никаких разработчиков компиляторов там не появилось :) Нашли похожий репорт: вот этот репорт - очень похоже, но репортер уверяет что появилось это с VS2017, а в 2015 все было хорошо. Ну я использовал воркэраунд с явным указанием размера массивов при их внешнем объявлении, в общем-то, сделал это еще до того как начал вопросы задавать, хотя это и не нравится.
...
Рейтинг: 0 / 0
зачем MSVC соптимизировал memcpy?
    #39793967
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleqie,

у тебя в целом неверный подход "я знаю что первый байт это длина"

пиши нормально
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / зачем MSVC соптимизировал memcpy?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]