根据 the GNU Lib C documentation on getcwd()。。。
这个函数的GNU C Library版本还允许您为缓冲区参数指定一个空指针。然后getcwd自动分配一个缓冲区,就像malloc一样(参见无约束分配)。如果大小大于零,那么缓冲区就是那么大;否则,缓冲区就和保存结果所需的大小一样大。
现在请注意使用GNU文档中描述的标准getcwd()实现:

char* gnu_getcwd ()
{
   size_t size = 100;
   while (1)
   {
      char *buffer = (char *) xmalloc (size);
      if (getcwd (buffer, size) == buffer)
        return buffer;
      free (buffer);
      if (errno != ERANGE)
        return 0;
      size *= 2;
   }
}

这对于可移植性和稳定性来说似乎是很好的,但对于分配和释放内存来说,这看起来也是一个笨拙的折衷方案。考虑到可能频繁调用函数,这是否可能是性能问题?
*很容易说“profile It”,但这并不能解释所有可能的系统;现在或将来。

最佳答案

初始尺寸为100,保持99焦炭路径,比典型系统上存在的大多数路径长。这通常意味着没有“分配和释放内存”,并且浪费的字节不超过98个。
在每次尝试中加倍的启发式意味着最大限度地发生寄生分配的对数数。在许多系统中,路径的最大长度是有限的,这意味着对重新分配的数量有有限的限制。
只要getcwd被用作黑盒,这是最好的选择。

关于c - GNU C实现getcwd()的性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24956867/

10-11 08:18