Форум программистов, компьютерный форум CyberForum.ru

Напишите свои аналоги функций 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. Создать нижний относительно побочной диагонали треугольник динамической квадратной матрицы. Рассортировать строки матрицы по возрастанию первых элементов строк проблема в том, что матрица триугольная и никак строки не поменяешь местами пишет ошибку. значет надо менять адреса а как? вот мой код int main () { int n; cout<<"Enter size"<<endl; cin>>n; int **arrow=new int*;
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(), strcpy(), strcmp() и сравните с библиотечными.
быстрый вариант 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);
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru