Это что-то не по теме, но когда я увидел вопрос, я сразу же задумался, было ли это на самом деле быстрее, чем просто сделать strlen и выполнить итерацию сзади.
Итак, я сделал небольшой тест.
#include <string.h>
void reverse1(const char* str)
{
int total = 0;
if (*str) {
reverse1(str+1);
total += *str;
}
}
void reverse2(const char* str)
{
int total = 0;
size_t t = strlen(str);
while (t > 0) {
total += str[--t];
}
}
int main()
{
const char* str = "here I put a very long string ...";
int i=99999;
while (--i > 0) reverseX(str);
}
Сначала я скомпилировал его с X = 1 (используя функцию reverse1), а затем с X = 2. Оба раза с -O0.
Он возвращал примерно 6 секунд для рекурсивной версии и 1,8 секунды для strlen-версии.
Я думаю, это потому, что strlen реализован на ассемблере, а рекурсия добавляет много накладных расходов.
Я совершенно уверен, что эталонный тест является репрезентативным, если я ошибаюсь, поправьте меня.
В любом случае, я подумал, что должен поделиться этим с вами.