在库的深处,我需要一个函数来分配一个字符串,将提供的 float 以 %f 格式写入字符串,然后返回它。 snprintf() 返回所需的字符数,这将允许我通过 2 个 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/