在库的深处,我需要一个函数来分配字符串,用%f格式将提供的浮点数写入字符串,然后返回它snprintf()返回需要的字符数,这将允许我用两个snprintf()调用分配正确的大小不幸的是,这是一个有点性能关键的部分,所以我想避免这一点,因为*printf()可能很慢(是的,在一些基准测试中,它确实显示在配置文件的#1)。
另一种方法是使用一些C99函数来解决这个问题,但是libm调用也需要相当长的时间我的函数的一个(非常简单,没有错误处理等)版本如下
// 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调用。
也可以对代码进行结构调整,以便使用alloca()和/或C99 VLA的堆栈分配,但由于堆栈空间通常非常有限,我希望避免在最坏情况下的缓冲区上耗尽大量内存。
有更好的主意吗?
最佳答案
你是在内存受限的系统中运行吗如果您不在真正需要计算字节的位置,只需确定最坏的情况,并使所有分配都达到这个大小。
另一个选择是让调用者提供缓冲区。
最后,你是否知道,你可以声明,不需要一次以上的有限数量的这些值存在吗?如果是,请预先为它们分配空间,不要在函数中执行malloc()既然你说性能很关键,你也应该尽量避免malloc()。
关于c - 在sprintf中找出“%f”格式的字段长度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9430415/