Почему реализация memcmp не является ярлыком memcmp (q, p, n) для случая, когда q == p? - PullRequest
0 голосов
/ 02 мая 2018

Если я передам memcmp равные указатели для своего первого и второго аргумента, Я подозревал, что он может просто вернуть 0 без проверки элементов - поскольку, если передан тот же указатель, элементы должны быть равны нулю Мне кажется, это хорошая оптимизация, чтобы проверить равенство указателей и выйти рано.

Я проверил glibc и Бесплатный BSD LibC реализации, и ни один из них, похоже, не делает эту оптимизацию.

Итак, я проверил стандарт (ниже): Черновая версия Open Standards C99 ни о чем не говорит:

7.21.4.1 Функция memcmp Синопсис

#include <string.h>
int memcmp(const void *s1, const void *s2, size_t n);

Описание

Функция memcmp сравнивает первые n символов объект, на который указывает s1 до первых n символов объекта на которое указывает s2.

Возвращает

Функция memcmp возвращает целое число, большее, чем, или меньше нуля, соответственно, так как объект, на который указывает s1, больше, равно или меньше объекта, на который указывает s2

Насколько я могу судить, это не запрещает такой "трюк", поскольку все равно можно получить те же возвращаемые значения. Это действительно деталь реализации, AFAICT.

Очевидно, что люди, пишущие эти библиотеки, гораздо больше задумывались над этим, чем я, поэтому, вероятно, есть веская причина этого не делать. Что это?

1 Ответ

0 голосов
/ 02 мая 2018

Я подозреваю, что это связано с практическими проблемами полезности.

На практике немногие люди предоставляют один и тот же указатель на 1-й и 2-й аргументы для memcmp(), поэтому в большинстве случаев дополнительный тест условия ничего не делает эффективно и, таким образом, является пустой тратой усилий.

Как отметил Феликс Палмен в комментариях, если два указателя могут быть статически подтверждены для указания на один и тот же адрес, компилятор может вместо этого выполнить оптимизацию.

...