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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 138, средняя оценка - 4.62
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

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

06.06.2009, 17:18. Просмотров 18176. Ответов 29
Метки нет (Все метки)

Напишите свои аналоги функций strlen(),strcpy(),strcmp() и сравните с библиотечными.
Наивно написал эти функции:
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
int strlen(char* c_str)
{
    int count=0;
    while(*c_str++) ++count;
    return count;
}
 
/************************************************/
 
void strcpy(char* c_str1,char* c_str2)
{
    while(*c_str2++=*c_str1++);
}
 
/************************************************/
 
int strcmp(char* c_str1,char* c_str2)
{
    if (strlen(c_str1)!=strlen(c_str2)) return 0;
    int count=strlen(c_str1)+1;
    while(*c_str1++==*c_str2++) --count;
    if (count) return 0;
    return 1;
}
Смотрю в библиотеке и вижу это(в файле string.h):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
/* Copy SRC to DEST.  */
extern char *strcpy (char *__restrict __dest, __const char *__restrict __src)
     __THROW __nonnull ((1, 2));
 
/************************************************/
 
extern int strcmp (__const char *__s1, __const char *__s2)
     __THROW __attribute_pure__ __nonnull ((1, 2));
 
/************************************************/
 
extern size_t strlen (__const char *__s)
     __THROW __attribute_pure__ __nonnull ((1));
Где сами алгоритмы функций?Что-то я запутался в этих файлах и не нашёл.Кто-нибудь может скопипастить/направить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2009, 17:18     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными.
Посмотрите здесь:
C++ Написать собственные аналоги функций strlen, strcmp, strchr, strcpy, strcat (дописать и исправить ошибки)
Реализовать собственные функции strcat, strcpy, strcmp, strlen C++
Как заменить функцию fgets на strlen и strcpy? C++
C++ Написать программу: работа с си строками, функции strlen, strcpy
Аналоги функций ord() и chr() C++
Есть в языке "С" аналоги функций Pos() и Delete()? C++
напишите в С++ программу-калькулятор арифметических функций C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xAtom
914 / 739 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
11.04.2011, 18:50     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #16
Зачем тебе это надо, протестируй их с библиотечными на время исполнения в цикле увидишь на сколько твои функции не эфективны лучще используй всегда библиотечные они очень быстры так как написаны на Assembler профи-спецами, не веришь смотри в исходники Visual C++ от 2002 подсмотри Asm модули от INTEL. тоже самое про memcpy - быстрее аналога от Windows CopyMemory.
flexin777
0 / 0 / 0
Регистрация: 09.04.2011
Сообщений: 5
11.04.2011, 19:11     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #17
xAtom,я просто сам хотел написать свои реализации этих функций.Сейчас я решаю упражнения в книге Страуструпа.
xAtom
914 / 739 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
11.04.2011, 19:47     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #18
Вот начиркал для демонстрации, одна функция реализованная на С++ другая на встроенном ASM.

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
// c++
int  _strcmp(const char* str1, const char*  str2) {
     while( *str1 == *str2 ) {
          *str1++;
          *str2++;
          if( *str1 == '\0' && *str2 == '\0' )
      return 0;
      }
      return   1;
}
 
// asm c++
int  strcmp_(const char*  str1, const char* str2) {
    int  res = 1;
    __asm {
       lea esi, str1
       lea edi, str2 
next:
       mov  al, byte ptr [esi]
       cmp  al, byte ptr [edi]
       jne   end;
                inc esi
       inc edi
       mov  al, byte ptr [esi]
       or  al, byte ptr [edi]
       jz   yes;
       jmp  next;
yes:
       mov  dword ptr res,  0           
end:
       };
       return  res;
}
 
 
// тестируем функцией winApi GetTickCount()
 
DWORD  begin = GetTickCount();
 
for(long i = 0L; i < 1000000; i++) {
   if(! strcmp("Hello World !!!", "Hello World !!!"))  // библотечная функция 1 - место 17-29 мск
       continue;
 /*  if(! strcmp_("Hello World !!!", "Hello World !!!")) //моя функц-asm c++ функция 2-место 37-45 мкс
      continue;
   if(! strcmp("Hello World !!!", "Hello World !!!"))  // моя функц-c++ 3 - место 120 - 157 мкс
       continue;*/
}
printf("elapsed = %d\n", GetTickCount() - begin);
Встроенный asm в с++ маленько не дотянул до модуля asm стандартной библиотеки, хотя по-алгоритму по asm можно писать ещё компактнее просто я давно уже в ASM не прогил, там уже встроенные функции аппаратно поддерживающие работы со строками cmps типа такого....

Добавлено через 5 минут
Цитата Сообщение от flexin777 Посмотреть сообщение
xAtom,я просто сам хотел написать свои реализации этих функций.Сейчас я решаю упражнения в книге Страуструпа.
Молодец flexin777, опыта наберёшся. Я тоже в своё время писал все стандартный библиотечные функции с/с++ strlen, strncmp, memcpy, memchr, memset и т.п, удачи...
prazuber
109 / 109 / 3
Регистрация: 29.04.2010
Сообщений: 240
11.04.2011, 23:05     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #19
Ради интереса в 2008 студии продебажил strcmp, strcpy, strlen. Код у мелкомягких написан на асме, но в комментариях пишут алгоритм. Вот что они предлагают:
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
int strlen (const char * str)
{
    int length = 0;
 
    while( *str++ )
        ++length;
 
    return( length );
}
 
char * strcpy (char * dst, char * src)
{
    char * cp = dst;
 
    while( *cp++ = *src++ )
            ;               /* Copy src over dst */
    return( dst );
}
 
int strcmp ( unsigned char * src , unsigned char * dst )
{
    int ret = 0 ;
 
    while( ! (ret = *src - *dst) && *dst)
            ++src, ++dst;
 
    if ( ret < 0 )
            ret = -1 ;
    else if ( ret > 0 )
            ret = 1 ;
 
    return( ret );
}
Форматирование сохранено

Добавлено через 5 минут
Правда код на асме у них вроде немного другой.. вот например strlen:
Assembler
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
        CODESEG
 
        public  strlen
 
strlen  proc \
        buf:ptr byte
 
        OPTION PROLOGUE:NONE, EPILOGUE:NONE
 
        .FPO    ( 0, 1, 0, 0, 0, 0 )
 
string  equ     [esp + 4]
 
        mov     ecx,string              ; ecx -> string
        test    ecx,3                   ; test if string is aligned on 32 bits
        je      short main_loop
 
str_misaligned:
        ; simple byte loop until string is aligned
        mov     al,byte ptr [ecx]
        add     ecx,1
        test    al,al
        je      short byte_3
        test    ecx,3
        jne     short str_misaligned
 
        add     eax,dword ptr 0         ; 5 byte nop to align label below
 
        align   16                      ; should be redundant
 
main_loop:
        mov     eax,dword ptr [ecx]     ; read 4 bytes
        mov     edx,7efefeffh
        add     edx,eax
        xor     eax,-1
        xor     eax,edx
        add     ecx,4
        test    eax,81010100h
        je      short main_loop
        ; found zero byte in the loop
        mov     eax,[ecx - 4]
        test    al,al                   ; is it byte 0
        je      short byte_0
        test    ah,ah                   ; is it byte 1
        je      short byte_1
        test    eax,00ff0000h           ; is it byte 2
        je      short byte_2
        test    eax,0ff000000h          ; is it byte 3
        je      short byte_3
        jmp     short main_loop         ; taken if bits 24-30 are clear and bit
                                        ; 31 is set
 
byte_3:
        lea     eax,[ecx - 1]
        mov     ecx,string
        sub     eax,ecx
        ret
byte_2:
        lea     eax,[ecx - 2]
        mov     ecx,string
        sub     eax,ecx
        ret
byte_1:
        lea     eax,[ecx - 3]
        mov     ecx,string
        sub     eax,ecx
        ret
byte_0:
        lea     eax,[ecx - 4]
        mov     ecx,string
        sub     eax,ecx
        ret
 
strlen  endp
 
        end
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 1
14.04.2011, 16:50     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #20
Assembler
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
;**************************  strlen32.asm  **********************************
; Author:           Agner Fog
; Date created:     2008-07-06
; Last modified:    2008-07-06
; Syntax:           MASM/ML 6.x, 32 bit
; Operating system: Windows, Linux, BSD or Mac, 32-bit x86
; Instruction set:  80386
; Description:
; Standard strlen function:
; size_t strlen(const char *str);
; Finds the length of a zero-terminated string of bytes, optimized for speed.
; Uses 32-bit registers to check four bytes at a time, all memory reads aligned.
;
; Alternatives:
; In 64-bit systems or when SSE2 is available, use strlenSSE2.asm
; More versions are available in www.agner.org/optimize/asmlib.zip
;
; The latest version of this file is available at:
; www.agner.org/optimize/asmexamples.zip
; Copyright (c) 2008 GNU General Public License www.gnu.org/copyleft/gpl.html
;******************************************************************************
.386
.model flat
 
.code
 
_strlen PROC    NEAR
; extern "C" int strlen (const char * s);
; Works in all 32-bit systems 
; In Linux, remove the underscore from the function name.
 
        push    ebx
        mov     ecx, [esp+8]           ; get pointer to string
        mov     eax, ecx               ; copy pointer
        and     ecx, 3                 ; lower 2 bits of address, check alignment
        jz      L2                     ; string is aligned by 4. Go to loop
        and     eax, -4                ; align pointer by 4
        mov     ebx, [eax]             ; read from nearest preceding boundary
        shl     ecx, 3                 ; mul by 8 = displacement in bits
        mov     edx, -1
        shl     edx, cl                ; make byte mask
        not     edx                    ; mask = 0FFH for false bytes
        or      ebx, edx               ; mask out false bytes
 
        ; check first four bytes for zero
        lea     ecx, [ebx-01010101H]   ; subtract 1 from each byte
        not     ebx                    ; invert all bytes
        and     ecx, ebx               ; and these two
        and     ecx, 80808080H         ; test all sign bits
        jnz     L3                     ; zero-byte found
        
        ; Main loop, read 4 bytes aligned
L1:     add     eax, 4                 ; increment pointer by 4
L2:     mov     ebx, [eax]             ; read 4 bytes of string
        lea     ecx, [ebx-01010101H]   ; subtract 1 from each byte
        not     ebx                    ; invert all bytes
        and     ecx, ebx               ; and these two
        and     ecx, 80808080H         ; test all sign bits
        jz      L1                     ; no zero bytes, continue loop
        
L3:     bsf     ecx, ecx               ; find right-most 1-bit
        shr     ecx, 3                 ; divide by 8 = byte index
        sub     eax, [esp+8]           ; subtract start address
        add     eax, ecx               ; add index to byte
        pop     ebx
        ret
_strlen ENDP
 
END
Evg
Эксперт CАвтор FAQ
17546 / 5784 / 370
Регистрация: 30.03.2009
Сообщений: 15,931
Записей в блоге: 26
14.04.2011, 16:58     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #21
Такой код кому-то может показаться избыточно длинным, но в случае длинных строк он будет работать в разы быстрее, чем примитивный код типа "while (*s++ != 0)". Принцип основан на том, что по строке программа идёт не по одному байту, а по 4 или 8 байт за одну итерацию цикла. И сразу 4 байта анализирует за раз. В таком коде на длинных строках будет, соответственно, в 4 или 8 раз меньше итераций цикла, но одна итерация будет немного больше, чем в побайтном случае. Вот вариант кода из glibc, он написан на Си, а потому будет более понятен. Да и комментарий там более внятный. Это некое "общее" решение, не заточенное под конкретну архитектуру. Хотя многие архитектуры используют коды, написанные на ассемблере

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/* Return the length of the null-terminated string STR.  Scan for
   the null terminator quickly by testing four bytes at a time.  */
size_t
strlen (str)
     const char *str;
{
  const char *char_ptr;
  const unsigned long int *longword_ptr;
  unsigned long int longword, magic_bits, himagic, lomagic;
 
  /* Handle the first few characters by reading one character at a time.
     Do this until CHAR_PTR is aligned on a longword boundary.  */
  for (char_ptr = str; ((unsigned long int) char_ptr
            & (sizeof (longword) - 1)) != 0;
       ++char_ptr)
    if (*char_ptr == '\0')
      return char_ptr - str;
 
  /* All these elucidatory comments refer to 4-byte longwords,
     but the theory applies equally well to 8-byte longwords.  */
 
  longword_ptr = (unsigned long int *) char_ptr;
 
  /* Bits 31, 24, 16, and 8 of this number are zero.  Call these bits
     the "holes."  Note that there is a hole just to the left of
     each byte, with an extra at the end:
 
     bits:  01111110 11111110 11111110 11111111
     bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD
 
     The 1-bits make sure that carries propagate to the next 0-bit.
     The 0-bits provide holes for carries to fall into.  */
  magic_bits = 0x7efefeffL;
  himagic = 0x80808080L;
  lomagic = 0x01010101L;
  if (sizeof (longword) > 4)
    {
      /* 64-bit version of the magic.  */
      /* Do the shift in two steps to avoid a warning if long has 32 bits.  */
      magic_bits = ((0x7efefefeL << 16) << 16) | 0xfefefeffL;
      himagic = ((himagic << 16) << 16) | himagic;
      lomagic = ((lomagic << 16) << 16) | lomagic;
    }
  if (sizeof (longword) > 8)
    abort ();
 
  /* Instead of the traditional loop which tests each character,
     we will test a longword at a time.  The tricky part is testing
     if *any of the four* bytes in the longword in question are zero.  */
  for (;;)
    {
      /* We tentatively exit the loop if adding MAGIC_BITS to
     LONGWORD fails to change any of the hole bits of LONGWORD.
 
     1) Is this safe?  Will it catch all the zero bytes?
     Suppose there is a byte with all zeros.  Any carry bits
     propagating from its left will fall into the hole at its
     least significant bit and stop.  Since there will be no
     carry from its most significant bit, the LSB of the
     byte to the left will be unchanged, and the zero will be
     detected.
 
     2) Is this worthwhile?  Will it ignore everything except
     zero bytes?  Suppose every byte of LONGWORD has a bit set
     somewhere.  There will be a carry into bit 8.  If bit 8
     is set, this will carry into bit 16.  If bit 8 is clear,
     one of bits 9-15 must be set, so there will be a carry
     into bit 16.  Similarly, there will be a carry into bit
     24.  If one of bits 24-30 is set, there will be a carry
     into bit 31, so all of the hole bits will be changed.
 
     The one misfire occurs when bits 24-30 are clear and bit
     31 is set; in this case, the hole at bit 31 is not
     changed.  If we had access to the processor carry flag,
     we could close this loophole by putting the fourth hole
     at bit 32!
 
     So it ignores everything except 128's, when they're aligned
     properly.  */
 
      longword = *longword_ptr++;
 
      if (
#if 0
      /* Add MAGIC_BITS to LONGWORD.  */
      (((longword + magic_bits)
 
        /* Set those bits that were unchanged by the addition.  */
        ^ ~longword)
 
       /* Look at only the hole bits.  If any of the hole bits
          are unchanged, most likely one of the bytes was a
          zero.  */
       & ~magic_bits)
#else
      ((longword - lomagic) & himagic)
#endif
      != 0)
    {
      /* Which of the bytes was the zero?  If none of them were, it was
         a misfire; continue the search.  */
 
      const char *cp = (const char *) (longword_ptr - 1);
 
      if (cp[0] == 0)
        return cp - str;
      if (cp[1] == 0)
        return cp - str + 1;
      if (cp[2] == 0)
        return cp - str + 2;
      if (cp[3] == 0)
        return cp - str + 3;
      if (sizeof (longword) > 4)
        {
          if (cp[4] == 0)
        return cp - str + 4;
          if (cp[5] == 0)
        return cp - str + 5;
          if (cp[6] == 0)
        return cp - str + 6;
          if (cp[7] == 0)
        return cp - str + 7;
        }
    }
    }
}
redial
1 / 1 / 0
Регистрация: 05.12.2010
Сообщений: 3
23.04.2011, 15:14     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #22
А по какому принципу библиотечная strcmp выдаёт результат(т.е. модуль числа)?
Evg
Эксперт CАвтор FAQ
17546 / 5784 / 370
Регистрация: 30.03.2009
Сообщений: 15,931
Записей в блоге: 26
23.04.2011, 15:49     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #23
это не модуль, а результат (меньше, больше, равно): http://linux.die.net/man/3/strcmp
redial
1 / 1 / 0
Регистрация: 05.12.2010
Сообщений: 3
23.04.2011, 16:02     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #24
Я имею в виду модуль результирующего числа,он же зависит от исходных строк.
Evg
Эксперт CАвтор FAQ
17546 / 5784 / 370
Регистрация: 30.03.2009
Сообщений: 15,931
Записей в блоге: 26
23.04.2011, 16:48     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #25
Цитата Сообщение от redial Посмотреть сообщение
Я имею в виду модуль результирующего числа,он же зависит от исходных строк.
Насколько я понимаю, сие никак не оговаривается. Оговаривается лишь то, что результат будет либо меньше нуля, либо равен нулю, либо больше нуля. Наверняка сие сказано в угоду производительности, чтобы не делать лишних телодвижений в функции и не привязываться к конкретному значению чисел
MrKarapuz
0 / 0 / 0
Регистрация: 09.11.2009
Сообщений: 3
29.05.2011, 19:25     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #26
быстрый вариант 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);
}
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.06.2011, 15:29     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #27
Также добрался до этого задания, написал свои варианты...
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
unsigned str_len(const char * str){
    int i=-1;
    while (str[++i]);
    return i; 
}
char * str_cpy(const char * from, char * to){
    char * x=to;
    while(*to++=*from++);  //скреативил из книги
    return x;  //насчет этого не уверен
}
char * str_chr(char * str, char chr){ //лишняя, но пусть будет
    while(*str)
        if (*str++==chr) return --str;
    return 0;
}
short str_cmp(const char * a, const char * b){
    if (str_len(a)>str_len(b)) return -1;
    if (str_len(a)<str_len(b)) return 1;
    for (int i=0; a[i]; i++){
        if (a[i]>b[i]) return -1;
        if (a[i]<b[i]) return 1;
    }
    return 0;
}
Точно работает только первое, в остальных сомневаюсь, т.к. точно не знаю, как они работают=)
MIfodij
1 / 1 / 0
Регистрация: 14.07.2011
Сообщений: 12
12.08.2011, 11:40     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #28
Подскажите пожалуйста а если аналоги этих функций в С++?
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.08.2011, 11:42     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #29
Цитата Сообщение от MIfodij Посмотреть сообщение
Подскажите пожалуйста а если аналоги этих функций в С++?
Если вы про string, то size(), operator ==, operator =
Ну а так-то это то же с++, только в си стиле =)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2011, 13:03     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными.
Еще ссылки по теме:
Не применяя библиотечных функций, напишите код функции C++
C++ Напишите программы для вычисления значений математических функций
Напишите варианты библиотечных функций strncpy, strncat и strncmp C++
C++ Напишите алгоритм сортировки массива по возрастанию, без использования встроенных функций языка

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17546 / 5784 / 370
Регистрация: 30.03.2009
Сообщений: 15,931
Записей в блоге: 26
12.08.2011, 13:03     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #30
Цитата Сообщение от MIfodij Посмотреть сообщение
Подскажите пожалуйста а если аналоги этих функций в С++?
Си++ опериует над строками в понятиях класса std::string
http://cplusplus.com/reference/string/string/
Yandex
Объявления
12.08.2011, 13:03     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru