Я хочу знать, какая реализация быстрее satoi1 vs satoi2
Как и в случае таких микрооптимизаций, часто теряется фокус на правильной функциональности. Вторая функция имеет бесконечное значение l oop, поэтому первая является самой быстрой. @ Том Карзес
С исправленным satoi2()
у него больше шансов быть быстрее с меньшим значением l oop, но нужно быть уверенным в профиле.
int satoi2_corrected(char **ptr, int maxdigits) {
char *s = *ptr;
char *s1 = s;
int val = 0;
while(isdigit(*s)) {
val = val *10 + (*s - '0');
s++; // Missing is OP's code
}
if((s - s1) > maxdigits)
errnum = ERR_TOO_MNY_DIG;
*ptr = s;
return val;
}
Неподвижный код имеет неопределенное поведение (UB).
// Avoid `is...(negative value)
/// while(isdigit(*s)) {
while(isdigit((unsigned char) *s)) {
Используйте unsigned
, чтобы избежать UB переполнения int
//int val = 0;
unsigned val = 0;
while(isdigit((unsigned char) *s)) {
val = val*10 + (*s - '0');
s++;
}
OP прокомментировал "Меня не волнует возвращаемое значение, так как действительное количество цифр число цифр <= 8 в любом случае". Если <code>val не требуется вообще, вычисление val
не требуется.
while(isdigit((unsigned char) *s)) {
s++;
}