Форум программистов, компьютерный форум, киберфорум
Наши страницы

Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Есть ли C++ нативный способ быстро обнулить массив (аналог bzero)? + ещё 2 вопроса http://www.cyberforum.ru/cpp-beginners/thread38637.html
Второй вопрос - если конструктор обнаружил условия, препятствующие созданию объекта, есть ли способ "не создавать" объект и не использовать потом дестуктор? Третий - стоит ли использовать...
C++ функция разбивает файл на биты.... Написать функцию,разбивающую файл на биты и записывающую последовательно эти биты с интервалом в 24 байт в другой файл. В случае нехватки длины 2-го файла вывести предупреждение сообщение и... http://www.cyberforum.ru/cpp-beginners/thread38636.html
Рассортировать строки матрицы по возрастанию первых элементов строк C++
8. Создать нижний относительно побочной диагонали треугольник динамической квадратной матрицы. Рассортировать строки матрицы по возрастанию первых элементов строк проблема в том, что матрица...
C++ Сохранение изображения
Моя программа похожа на PAINT только под DOS в Borland C 3.1. Как мне сохранять рисунки которые я рисую?
C++ Изобразить движение по спирали http://www.cyberforum.ru/cpp-beginners/thread38629.html
Помогите зделать движение по спирали(на рисунку). Я так понимаю надо двигатса по елипсу и смещать центр, но не знаю как это зделать.
C++ Двумерные массивы (+символьные) Вот 5 задач... необходимо помочь братишке... сам я в С++ не особо силен... Сильно прошу вас помочь мне... За оказанную услугу готов оказать услугу написания сайта) очень жду помощи... 1) Дан... подробнее

Показать сообщение отдельно
MrKarapuz
0 / 0 / 0
Регистрация: 09.11.2009
Сообщений: 3
29.05.2011, 19:25
быстрый вариант strlen для символов с размером 1,2,4 байта
требуеться sse2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//header
UINTPTR _fastcall   slen_b(const UINT8* pstr);
UINTPTR _fastcall   slen_w(const UINT16* pstr);
UINTPTR _fastcall   slen_d(const UINT32* pstr);
inline  UINTPTR slen_tselect(const void* pstr,tselect<1>)   {return slen_b((const UINT8*)pstr);}
inline  UINTPTR slen_tselect(const void* pstr,tselect<2>)   {return slen_w((const UINT16*)pstr);}
inline  UINTPTR slen_tselect(const void* pstr,tselect<4>)   {return slen_d((const UINT32*)pstr);}
template<class T> inline UINTPTR slen(const T* pstr)    {return slen_tselect(pstr,tselect<sizeof T>());};
 
//cpp
template<class T> __forceinline UINTPTR slen_sse2(const T* pstr){
    const T* ptr = pstr;
    if (ptr){
        if (!((UINTPTR)ptr & (sizeof T - 1))){
            vec_sse_proto<T>    a,b;
            a.setz();       //xorps xmm0,xmm0
            UINT32  result = (UINTPTR)ptr & 15;
            ptr = (T*)((UINT8*)ptr - result);
            result = 0xffffffff << result;
            b.load(ptr);    //movaps    xmm1,[ptr]
            b.pcmpeq(a);    //pcmpeq[b/w/d] xmm1,xmm0
            ptr += 16/sizeof T;
            result &= b.movemaskb();    //movemaskb r32,xmm1
            while(!result){
                b.load(ptr);
                b.pcmpeq(a);
                ptr += 16/sizeof T;
                result = b.movemaskb();     
            }
            result = bit_sf(result);
            ptr = (T*)((UINT8*)ptr + result - 16);
        }else{
            //если данные не выровнены по размеру типа
            while(*ptr++);
        }
    }
    return ptr - pstr;
}
 
UINTPTR  _fastcall  slen_b(const UINT8* pstr)   {return slen_sse2(pstr);}
UINTPTR  _fastcall  slen_w(const UINT16* pstr)  {return slen_sse2(pstr);}
UINTPTR  _fastcall  slen_d(const UINT32* pstr)  {return slen_sse2(pstr);}
быстрый вариант strcpy для символов с размером 1,2,4 байта
требуеться sse2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//header
UINTPTR _fastcall scopy_b(UINT8* pdest,const UINT8* psrc);
UINTPTR _fastcall scopy_w(UINT16* pdest,const UINT16* psrc);
UINTPTR _fastcall scopy_d(UINT32* pdest,const UINT32* psrc);
дописать
inline  UINTPTR scopy_tselect(void* pdest,const void* psrc,tselect<1>){
   return scopy_b((UINT8*)pdest,(const UINT8*)psrc);
}
inline  UINTPTR scopy_tselect(void* pdest,const void* psrc,tselect<2>){
   return scopy_w((UINT16*)pdest,(const UINT16*)psrc);
}
inline  UINTPTR scopy_tselect(void* pdest,const void* psrc,tselect<4>){
   return scopy_d((UINT32*)pdest,(const UINT32*)psrc);
}
template<class TYPE> inline UINTPTR scopy(TYPE* pdest,const TYPE* psrc) {
   return scopy_tselect(pdest,psrc,tselect<sizeof TYPE>());
}
//cpp
 template<class T> __forceinline UINTPTR scopy_sse2(T* pdest,const T* psrc){
    const T* ps = psrc;
    if (pdest && psrc){
        if (!((UINTPTR)ps & (sizeof T -1))){
            while((UINTPTR)ps & 15){
                if (!(*pdest++ = *ps++))
                    return ps-psrc;
            }
            while(1){
                vec_sse_proto<T> v,z;
                v.load(ps);     //movaps  xmm0,[src]
                z.setz();       //pxorps      xmm1,xmm1
                z.pcmpeq(v);        //pcmpeq[b/w/d]  xmm1,xmm0
                if (z.movemaskb())  //movemaskb  r32,xmm1
                    break;
                v.storeu_fast(pdest);   //movlps [dest],xmm0
                            //movhps [dest+8],xmm0
                ps += 16/sizeof T;
                pdest += 16/sizeof T;
            }
        }
        while(*pdest++ = *ps++);
    }
    return ps-psrc;
}
 
UINTPTR _fastcall   scopy_b(UINT8* pdest,const UINT8* psrc){
    return scopy_sse2(pdest,psrc);
}
UINTPTR _fastcall   scopy_w(UINT16* pdest,const UINT16* psrc){
    return scopy_sse2(pdest,psrc);
}
UINTPTR _fastcall   scopy_d(UINT32* pdest,const UINT32* psrc){
    return scopy_sse2(pdest,psrc);
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru