Какова фактическая разница между memchr()
и strchr()
, кроме дополнительного параметра? Когда вы используете тот или иной? и будет ли более эффективная производительность, заменяющая strchr()
на memchr()
, если синтаксический анализ большого файла (теоретически)?
Различия между memchr() и strchr()
Ответ 1
strchr
останавливается при достижении нулевого символа, но memchr
не работает; поэтому первый не нуждается в параметре длины, но последний делает.
Ответ 2
Функционально нет никакой разницы в том, что они оба сканируют массив/указатель для предоставленного значения. В версии 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
можно использовать для нахождения нулевого терминатора в строке. Это определенно не оптимальная реализация, потому что она дважды перемещает память. Но это служит для демонстрации того, насколько они близки по функциональности.
Ответ 3
strchr
ожидает, что первый параметр завершает нуль и, следовательно, не требует параметра длины.
memchr
работает аналогично, но не ожидает, что блок памяти будет завершен до нуля, поэтому вы можете успешно искать символ \0
.
Ответ 4
Нет реальной разницы, просто strchr()
предполагает, что он просматривает строку с нулевым завершением (так что определяет размер).
memchr()
просто ищет заданное значение до размера, переданного в.
Ответ 5
В практическом плане нет большой разницы. Кроме того, реализации могут сделать одну функцию быстрее другой.
Реальная разница возникает из контекста. Если вы имеете дело со строками, используйте strchr()
. Если у вас есть конечный буфер без конца, используйте memchr()
. Если вы хотите найти подмножество конечного размера строки, используйте memchr()
.