Bzero() & bcopy() по сравнению с memset() и memcpy()
Есть ли причина использовать нестандартные bzero()
и bcopy()
вместо memset()
и memcpy()
в среде Linux? Я слышал, что многие говорят, что они лучше подходят для компиляторов Linux, но не имеют никаких преимуществ перед стандартными функциями.
Являются ли они более оптимизированными, чем стандартные, или у них есть какая-либо поведенческая особенность, для которой они предпочтительнее?
Ответы
Ответ 1
Функции bzero
и bcopy
на самом деле не являются стандартными (ISO) C, они были предметом POSIX (с точки зрения официальных стандартов - на самом деле они предварительно датированы как ISO, так и POSIX).
И обратите внимание, что слово "были" - они устарели в POSIX.1-2001 и удалены в POSIX.1-2008 в знак уважения к memset
, memcpy
и memmove
, поэтому вам лучше использовать стандартные функции C.
Если у вас много кода, который их использует, и вы не хотите идти и изменять его (хотя, вероятно, вам стоит в какой-то момент), вы можете использовать следующие быстрые замены:
// void bzero(void *s, size_t n);
#define bzero(s, n) memset((s), 0, (n))
// void bcopy(const void *s1, void *s2, size_t n);
#define bcopy(s1, s2, n) memmove((s2), (s1), (n))
Ответ 2
#include <strings.h>
void bcopy(const void *src, void *dest, size_t n);
Описание
Функция bcopy() копирует n байтов из src в dest. Результат правильный, даже если обе области перекрываются.
Соответствует:
4.3BSD, кажется, что b поступает из BSD и кажется устаревшим.
Это означает, что bcopy аналогичен memmove(), а не memcpy(), поскольку R.. сказал в своем комментарии.
Примечание: строка s.h также отличается от string.h.
Ответ 3
На самом деле, сегодня это может быть наоборот. Вы видите, что, поскольку и memset
включены в стандарт, компилятору будет разрешено предположить, что вызванная функция выполняет именно то, что предписывает стандарт. Это означает, что компилятор может заменить их наиболее эффективным способом выполнения операции, которую он может определить. С bcopy
и bzero
, с другой стороны, стандарт не предписывает никаких действий по тем, чтобы компилятор не мог ничего принять, а это значит, что компилятор должен будет выполнить фактический вызов функции.
Однако, например, GCC знает о bcopy
и bzero
, если он создан для ОС, которые их имеют.