Si está que presionado por la eficiencia, probablemente pueda motivar el tiempo para escribir y depurar el suyo.
Pero: solo hazlo con una copia; es probable que tenga un límite superior de cuánto tiempo puede ser la cadena (un número decimal que se ajusta en un long
tiene un límite superior estricto en su longitud máxima), por lo que puede tener un búfer estático. Luego, perfila toda tu aplicación y ve si la copia/conversión realmente es un cuello de botella. Si realmente es así, entonces sabes que necesitas escribir el tuyo.
Aquí hay una áspera (no probado, navegador por escrito) Punto de partida:
long limited_strtol(const char *string, size_t len)
{
long sign = 1;
long value = 0;
for(; len > 0 && *string == '-'; string++, len--)
sign *= -1;
for(; len > 0 && isdigit(*string); string++, len--)
{
value *= 10;
value += *string - '0';
len--;
string++;
}
return sign * value;
}