Почему clang (x86-64 7.0.0) генерирует хуже код (в данном примере)?

Всем привет!
Я изучаю язык С, понемного читаю разные книги, и изучаю как работают стандартные функции библиотеки. Затем пытаюсь реализовать их сам. Пользуюсь сайтом cppreference и исходниками libc-OpenBSD когда хочу сравнить свой код или посмотреть как сделано там, для сравнения использую godbolt Compiler Exlorer.
Так вот, написал я такой код для стандартной функции strrchr:
char *strrchr(char const *beg, int chr)
{
	char const *fnd;

	for (fnd = NULL; *beg != '\0'; ++beg)
		if (*beg == (char)chr)
			fnd = beg;
	return (char *)fnd;
}

Затем посмотрел, как это реализовано в OpenBSD (не дословно):
char *strrchr(char const *beg, int chr)
{
	char const *fnd;

	for (fnd = NULL;; ++beg) {
		if (*beg == (char)chr)
			fnd = beg;
		if (*beg == '\0')
			return (char *)fnd;
	}
}

Почему компилятор для моей реализации, генерирует код хуже, чем для реализации OpenBSD?
(в обоих случаях использовал: сперва без оптимизаций, затем флаг оптимизации -O3)
В чем принципиальная разница, не могу понять?
Что можно почитать чтобы понять как писать такой C код, чтобы компилятор генерировал хороший код?
От чего это вообще зависит?
  • Вопрос задан
  • 599 просмотров
Пригласить эксперта
Ответы на вопрос 1
@code07734
Ассемблер посмотрите, который выдает компилятор.
Компилятор не всегда догадывается оптимизировать.
На глаз кажется у них меньше условных переходов, а ваш код так написан что компилятор не придумает ему оптимизацию.
У них 2 if'а станут одним условным переходом. У вас - 1 if им станет.
В цикле у вас больше проверок, не догадывается компилятор за скобки вынести - он же не учится как нейросеть или человек.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы