memcpy

Тема в разделе "LANGS.C", создана пользователем GoldFinch, 5 июл 2009.

  1. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    в MSVC, если написать
    Код (Text):
    1. int x;
    2. memcpy(buf,&x,sizrof(x));
    тогда это соптимизируется в последовательность mov (тут "mov x,y")

    так будет всегда со всеми арифметическими типами?
    и что у других компиляторов, например у gcc?
     
  2. ckunep

    ckunep New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2008
    Сообщения:
    19
    хотелось кстати бы узнать, какой код будет работать быстрее. Если нам нужно скопировать содержимое одного массива в другой массив, лучше использовать memcpy или цикл. На моем компьютере быстрее выполняется через цикл, но может есть предпосылки испл. memcpy?
     
  3. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    ckunep
    Используй нормальный компилятор и memcpy
     
  4. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    а не "в виндовсе" что? и в чем правильность?
     
  5. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    бредит он, memcpy к винде не имеет отношения
     
  6. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    memcpy это ф-я рантайма С, причем тут винда вообще?
     
  7. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    функция memcpy С\С++ не имеет никакого отношения к *dll.memcpy
     
  8. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Зачем чтото дизасмить? Достаточно собрать свой проект достойным компилятором (Intel'овским к примеру), а потом глянуть во что он превратит memcpy, поверь, под данную платформу он сгенерит для этой ф-ции оптимальный код(причем оптимизировано будет вплоть до учета зависимости от размера данных).
    Я понял твою точку зрения, но всеже топик находиться в разделе LANG.C, а значит речь идет именно о Сишной memcpy. А ОС-зависимые реализации этой ф-ции скорее всего нужны только для отдельных компонент самой ОС, врятли ктото в здравом уме в обычном приложении откажется от CRT'шной реализации этой ф-ции.
     
  9. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Достаточно прочитать 1й пост чтобы понять что человек интересуется реализацией memcpy на разных компиляторах.
     
  10. Ox8BFF55

    Ox8BFF55 New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2009
    Сообщения:
    181
    В VS6 реализованно через цикл.
    В gcc раньше тоже было через обычный цикл.

    А в VS2005(не знаю как 2003) уже соптимизированно и быстрее чем rep(*)....

    P.S в коде ядра Linux до чес пор через цикл...
     
  11. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Ничего подобного.
    Там шаблонов гораздо больше.
    Всё зависит от размера копируемых данных.
    Например memcpy(dst,src,20) будет реализовано не циклом, а примерно так:
    Код (Text):
    1. mov eax,[src+0]
    2. mov [dst+0],eax
    3. mov eax,[src+4]
    4. mov [dst+4],eax
    5. mov eax,[src+8]
    6. mov [dst+8],eax
    7. mov eax,[src+0Ch]
    8. mov [dst+0Ch],eax
    9. mov eax,[src+10h]
    10. mov [dst+10h],eax
    При других размерах будет другой код.
    Проверялось на VC++ 6.0 Pro SP3, Standart Edition всегда на rep movs заменяет.
     
  12. megaaa

    megaaa New Member

    Публикаций:
    0
    Регистрация:
    29 май 2009
    Сообщения:
    51
    а не проще написать свои ф-ции для работы со строками и с памятью?

    Код (Text):
    1. void memcpy( ... )
    2. {
    3.         pushad
    4.         mov     esi, [ szBuf_s ]
    5.         mov     edi, [ szBuf_d ]
    6.         mov     ecx, [ uLen ]
    7.         rep     movsb
    8.         popad
    9. }
     
  13. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Кхм, а как там еще должно быть? ты не забывай что ядро переносимо. НО я думаю когда пишеться апаратная часть, там эти функции перекгружаються и все.
     
  14. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Функции работы с памятью memcpy,memset,memmove и т.д. реализованы не только в msvcrt.dll и ее модификациях, но и в Виндовых kernel32.dll и ntdll.dll. Если уж действительно интересует оптимизация - возьмите дизассемблер и посмотрите.
     
  15. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    ктонить вообще 1й пост читает, или сразу бред в последних постах?
    какая оптимизация? какие msvcrt.dll ?? я спрашивал про memcpy для арифметических типов, т.е. будет ли код
    memcpy(buf,&x,sizeof(x); // int x;
    эквивалентен коду
    *(int*)buf=x; // int x;
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    GoldFinch
    Зачем тебе это? Оптимизация по определению специфична.
     
  17. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Booster
    затем что если это так, (а в msvc это так), то мне не надо писать отдельный "оптимальный" код для арифметических типов, а всё копировать через memcpy
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    GoldFinch
    Веселишь однако. Какой ещё оптимальный код для арифметических типов? Зачем их сувать в memcpy? cl например любит копирование в цикле менять на memcpy. Но что с того? Будешь перелопачивать все компиляторы?
     
  19. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    млять, мне нада выбрать, юзать такой код:
    Код (Text):
    1. //только memcpy
    2.  
    3. struct pod_type
    4. {
    5.     template<typename T>
    6.     static void copy(T& t)
    7.     {
    8.         memcpy(buf,&t,sizeof(T));
    9.     }
    10. }
    11. template<typename T>
    12. void copy(T& t)
    13. {
    14.     boost::mpl::if_< boost::is_pod,
    15.         pod_type,
    16.     //else
    17.         ...
    18.     >::type::copy(t);
    19. }
    или такой:
    Код (Text):
    1. //для арифметических типов - присваивание
    2.  
    3. struct pod_type
    4. {
    5.     template<typename T>
    6.     static void copy(T& t)
    7.     {
    8.         memcpy(buf,&t,sizeof(T));
    9.     }
    10. }
    11. struct arithmetic_type
    12. {
    13.     template<typename T>
    14.     static void copy(T& t)
    15.     {
    16.         *(T*)buf = t;
    17.     }
    18. }
    19. template<typename T>
    20. void copy(T& t)
    21. {
    22.     boost::mpl::if_< boost::is_arithmetic<T>,
    23.         arithmetic_type,
    24.     //else
    25.     boost::mpl::if_< boost::is_pod<T>,
    26.         pod_type,
    27.     //else
    28.         ...
    29.     >::type
    30.     >::type::copy(t);
    31. }
     
  20. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Зачем memcpy? Почему присваивание не устраивает?