Так глубоко внутри библиотеки мне нужна функция, которая выделяет строку, записывает предоставленное число с плавающей запятой в строку в формате% f и возвращает ее. snprintf () возвращает количество символов, которое потребуется, что позволило бы мне выделить правильный размер с помощью 2 вызовов snprintf (). К сожалению, это в некоторой степени критично для производительности, поэтому я бы хотел избежать этого, так как * printf () может быть медленным (да, в некоторых тестах он отображается на # 1 в профиле).
Другой способ - использовать некоторые функции C99, чтобы понять это, но вызовы libm также занимают немало времени. Версия моей функции (очень упрощенная, без обработки ошибок и т. Д.) Будет выглядеть примерно так:
<code>
// Return a string containing number x in %f format with d digits after the decimal point.
char* my_function(double x, int d)
{
int n = ceil(log10(pow(2, ilogb(x))));
// 3 extra chars, the initial sign, the ".", and the terminating null.
char *s = malloc(n + d + 3);
snprintf(s, n + d+ 3, "%#-+.*f", d, x);
return s;
}
Потенциально даже более быстрый способ - выделить строку, которая является «достаточно большой», а затем выполнить второй вызов snprintf только в том случае, если произошло маловероятное и оказалось, что оно слишком короткое.
Также возможно структурировать код так, чтобы я мог использовать выделение стека с помощью VLA alloca () и / или C99, но так как пространство стека часто довольно ограничено, я бы хотел избежать потери большого количества памяти на худшие размер буфера.
Есть идея получше?