в MSVC, если написать Код (Text): int x; memcpy(buf,&x,sizrof(x)); тогда это соптимизируется в последовательность mov (тут "mov x,y") так будет всегда со всеми арифметическими типами? и что у других компиляторов, например у gcc?
хотелось кстати бы узнать, какой код будет работать быстрее. Если нам нужно скопировать содержимое одного массива в другой массив, лучше использовать memcpy или цикл. На моем компьютере быстрее выполняется через цикл, но может есть предпосылки испл. memcpy?
Зачем чтото дизасмить? Достаточно собрать свой проект достойным компилятором (Intel'овским к примеру), а потом глянуть во что он превратит memcpy, поверь, под данную платформу он сгенерит для этой ф-ции оптимальный код(причем оптимизировано будет вплоть до учета зависимости от размера данных). Я понял твою точку зрения, но всеже топик находиться в разделе LANG.C, а значит речь идет именно о Сишной memcpy. А ОС-зависимые реализации этой ф-ции скорее всего нужны только для отдельных компонент самой ОС, врятли ктото в здравом уме в обычном приложении откажется от CRT'шной реализации этой ф-ции.
Достаточно прочитать 1й пост чтобы понять что человек интересуется реализацией memcpy на разных компиляторах.
В VS6 реализованно через цикл. В gcc раньше тоже было через обычный цикл. А в VS2005(не знаю как 2003) уже соптимизированно и быстрее чем rep(*).... P.S в коде ядра Linux до чес пор через цикл...
Ничего подобного. Там шаблонов гораздо больше. Всё зависит от размера копируемых данных. Например memcpy(dst,src,20) будет реализовано не циклом, а примерно так: Код (Text): mov eax,[src+0] mov [dst+0],eax mov eax,[src+4] mov [dst+4],eax mov eax,[src+8] mov [dst+8],eax mov eax,[src+0Ch] mov [dst+0Ch],eax mov eax,[src+10h] mov [dst+10h],eax При других размерах будет другой код. Проверялось на VC++ 6.0 Pro SP3, Standart Edition всегда на rep movs заменяет.
а не проще написать свои ф-ции для работы со строками и с памятью? Код (Text): void memcpy( ... ) { pushad mov esi, [ szBuf_s ] mov edi, [ szBuf_d ] mov ecx, [ uLen ] rep movsb popad }
Кхм, а как там еще должно быть? ты не забывай что ядро переносимо. НО я думаю когда пишеться апаратная часть, там эти функции перекгружаються и все.
Функции работы с памятью memcpy,memset,memmove и т.д. реализованы не только в msvcrt.dll и ее модификациях, но и в Виндовых kernel32.dll и ntdll.dll. Если уж действительно интересует оптимизация - возьмите дизассемблер и посмотрите.
ктонить вообще 1й пост читает, или сразу бред в последних постах? какая оптимизация? какие msvcrt.dll ?? я спрашивал про memcpy для арифметических типов, т.е. будет ли код memcpy(buf,&x,sizeof(x); // int x; эквивалентен коду *(int*)buf=x; // int x;
Booster затем что если это так, (а в msvc это так), то мне не надо писать отдельный "оптимальный" код для арифметических типов, а всё копировать через memcpy
GoldFinch Веселишь однако. Какой ещё оптимальный код для арифметических типов? Зачем их сувать в memcpy? cl например любит копирование в цикле менять на memcpy. Но что с того? Будешь перелопачивать все компиляторы?
млять, мне нада выбрать, юзать такой код: Код (Text): //только memcpy struct pod_type { template<typename T> static void copy(T& t) { memcpy(buf,&t,sizeof(T)); } } template<typename T> void copy(T& t) { boost::mpl::if_< boost::is_pod, pod_type, //else ... >::type::copy(t); } или такой: Код (Text): //для арифметических типов - присваивание struct pod_type { template<typename T> static void copy(T& t) { memcpy(buf,&t,sizeof(T)); } } struct arithmetic_type { template<typename T> static void copy(T& t) { *(T*)buf = t; } } template<typename T> void copy(T& t) { boost::mpl::if_< boost::is_arithmetic<T>, arithmetic_type, //else boost::mpl::if_< boost::is_pod<T>, pod_type, //else ... >::type >::type::copy(t); }