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, если он создан для ОС, которые их имеют.