Как рассчитать длину строки в C эффективно? - PullRequest
20 голосов
/ 15 января 2010

Как рассчитать длину строки в C эффективно (по времени)?

Прямо сейчас я делаю:

int calculate_length(char *string) {
    int length = 0;
    while (string[length] != '\0') {
        length++;
    }
    return length;
}

Но это очень медленно по сравнению с strlen (), например, есть ли другой способ сделать это?

Спасибо.

РЕДАКТИРОВАТЬ: я работаю в автономной среде, мне не разрешено использовать какие-либо внешние библиотеки, включая "string.h".

Ответы [ 14 ]

0 голосов
/ 26 июля 2016

Я не совсем уверен, что вы хотите сделать.

Вы хотите переписать strlen, чтобы сделать ваш код совместимым со стандартной библиотекой c, или вы хотите управлять строками.

В первом случае, я думаю, вам лучше напрямую использовать стандартные библиотеки.

Другой случай интересен: вы должны взглянуть на строковый класс c ++, в котором реализована стратегия свойств (позволяющая быстро манипулировать очень большими строками).

0 голосов
/ 04 апреля 2013

Некоторые из приведенных выше ответов очень хороши, и это мое мнение. Существует ключевое слово, известное как «регистрация»

#include <stdio.h>
size_t strlenNew(char *s);

int main(int argc, char* argv[])
{
    printf("Size of \"Hello World\" is ::\t%d",strlenNew("Hello World"));
    return 0;
}

size_t strlenNew(char *s)
{
    register int i=0;
    while(s[i]!='\0') i++;
    return i;
}

Читайте здесь: http://gustedt.wordpress.com/2010/08/17/a-common-misconsception-the-register-keyword/ и http://msdn.microsoft.com/en-us/library/482s4fy9(v=vs.80).aspx

С первой ссылки:

Это может быть особенно полезно для переменных массива. Переменная массива легко спутать с переменной указателя. Если это не сопровождается [expr] или с sizeof он оценивает по адресу первого элемент. Если вы объявляете регистр массива, все эти варианты использования запрещено; мы получаем доступ только к отдельным элементам или запрашиваем общее количество размер. Такой регистр-массив тогда может быть гораздо проще использовать, как если бы он просто набор переменных был оптимизатором. Нет псевдонимов (доступ одна и та же переменная через разные указатели).

Таким образом, иногда могут быть колебания производительности. Лично это одна из моих любимых реализаций, но Судханшу и Андомар также обеспечивают хорошую реализацию:)

0 голосов
/ 25 января 2012
int max;
max = sizeof(str);
return (--max);
0 голосов
/ 15 января 2010

На процессорах i386 libc часто использует ультраоптимизированную версию strlen, часто написанную на ассемблере.В документе « Длина строки » объясняется, как они работают.

Вот одна оптимизированная версия для OpenBSD .(У них также есть портативная версия .) Вот версия для GNU libc .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...