Форум программистов, компьютерный форум 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. Создать нижний относительно побочной диагонали треугольник динамической квадратной матрицы. Рассортировать строки матрицы по возрастанию первых элементов строк проблема в том, что матрица...
C++ Сохранение изображения
Моя программа похожа на PAINT только под DOS в Borland C 3.1. Как мне сохранять рисунки которые я рисую?
C++ Изобразить движение по спирали http://www.cyberforum.ru/cpp-beginners/thread38629.html
Помогите зделать движение по спирали(на рисунку). Я так понимаю надо двигатса по елипсу и смещать центр, но не знаю как это зделать.
C++ Двумерные массивы (+символьные) Вот 5 задач... необходимо помочь братишке... сам я в С++ не особо силен... Сильно прошу вас помочь мне... За оказанную услугу готов оказать услугу написания сайта) очень жду помощи... 1) Дан... подробнее

Показать сообщение отдельно
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.06.2009, 18:11  [ТС]
Только сейчас дошло,что вся библиотека имеет закрытый код...Это правда так?? Очень печально.Насчёт инкремента спасибо,постараюсь запомнить.Правда этот вариант с char вроде потом переделали,
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
#include <sys/cdefs.h>
__FBSDID("$FreeBSD: src/lib/libc/string/strlen.c,v 1.6 2009/01/25 23:08:47 delphij Exp $");
 
#include <sys/limits.h>
#include <sys/types.h>
#include <string.h>
 
/*
 * Portable strlen() for 32-bit and 64-bit systems.
 *
 * Rationale: it is generally much more efficient to do word length
 * operations and avoid branches on modern computer systems, as
 * compared to byte-length operations with a lot of branches.
 *
 * The expression:
 *
 *  ((x - 0x01....01) & ~x & 0x80....80)
 *
 * would evaluate to a non-zero value iff any of the bytes in the
 * original word is zero.  However, we can further reduce ~1/3 of
 * time if we consider that strlen() usually operate on 7-bit ASCII
 * by employing the following expression, which allows false positive
 * when high bit of 1 and use the tail case to catch these case:
 *
 *  ((x - 0x01....01) & 0x80....80)
 *
 * This is more than 5.2 times as compared to the raw implementation
 * on Intel T7300 under EM64T mode for strings longer than word length.
 */
 
/* Magic numbers for the algorithm */
#if LONG_BIT == 32
static const unsigned long mask01 = 0x01010101;
static const unsigned long mask80 = 0x80808080;
#elif LONG_BIT == 64
static const unsigned long mask01 = 0x0101010101010101;
static const unsigned long mask80 = 0x8080808080808080;
#else
#error Unsupported word size
#endif
 
#define LONGPTR_MASK (sizeof(long) - 1)
 
/*
 * Helper macro to return string length if we caught the zero
 * byte.
 */
#define testbyte(x)             \
    do {                    \
        if (p[x] == '\0')       \
            return (p - str + x);   \
    } while (0)
 
size_t
strlen(const char *str)
{
    const char *p;
    const unsigned long *lp;
 
    /* Skip the first few bytes until we have an aligned p */
    for (p = str; (uintptr_t)p & LONGPTR_MASK; p++)
        if (*p == '\0')
        return (p - str);
 
    /* Scan the rest of the string using word sized operation */
    for (lp = (const unsigned long *)p; ; lp++)
        if ((*lp - mask01) & mask80) {
        p = (const char *)(lp);
        testbyte(0);
        testbyte(1);
        testbyte(2);
        testbyte(3);
#if (LONG_BIT >= 64)
        testbyte(4);
        testbyte(5);
        testbyte(6);
        testbyte(7);
#endif
        }
 
    /* NOTREACHED */
    return 0;
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru