Различия между memchr () и strchr () - PullRequest
20 голосов
/ 23 ноября 2010

Какая фактическая разница между memchr() и strchr(), кроме дополнительного параметра? Когда вы используете один или другой? и будет ли лучшая производительность результата заменив strchr() на memchr() при анализе большого файла (теоретически)?

Ответы [ 5 ]

14 голосов
/ 23 ноября 2010

strchr останавливается при попадании в нулевой символ, но memchr - нет;вот почему первому не нужен параметр длины, а второму нужен

9 голосов
/ 23 ноября 2010

Функционально нет разницы в том, что они оба сканируют массив / указатель на предмет заданного значения.Версия memchr просто принимает дополнительный параметр, потому что ему нужно знать длину предоставленного указателя.Версия strchr может избежать этого, потому что она может использовать strlen для вычисления длины строки.

Различия могут появиться, если вы попытаетесь использовать char*, который хранит двоичные данные с strchr, поскольку он потенциально не будет видеть всю длину строки.Это верно почти для любого char* с двоичными данными и функцией str*.Для недвоичных данных, хотя они практически одинаковые функции.

На самом деле вы можете довольно просто кодировать strchr в терминах memchr

const char* strchr(const char* pStr, char value) {
  return (const char*)memchr(pStr, value, strlen(pStr)+1);
}

Здесь необходимо +1, поскольку strchr можно использовать для поиска нулевого терминаторав строке.Это определенно не оптимальная реализация, потому что она обходит память дважды.Но это служит для демонстрации того, насколько близки оба в функциональности.

2 голосов
/ 23 ноября 2010

strchr ожидает, что первый параметр заканчивается нулем, и, следовательно, не требует параметра длины.

memchr работает аналогично, но не ожидает, что блок памяти завершается нулем, поэтому вы можете успешно искать символ \0.

1 голос
/ 23 ноября 2010

Никакой реальной разницы, просто strchr() предполагает, что просматривает строку с нулевым символом в конце (так что определяет размер).

memchr() просто ищет заданное значение вплоть до переданного размерав.

0 голосов
/ 23 ноября 2010

С практической точки зрения, нет большой разницы.Кроме того, реализации могут сделать одну функцию быстрее другой.

Реальное отличие заключается в контексте.Если вы имеете дело со строками, используйте strchr().Если у вас есть неограниченный буфер конечного размера, используйте memchr().Если вы хотите найти подмножество строки конечного размера, используйте memchr().

...