【发布时间】:2014-07-25 13:28:12
【问题描述】:
根据 the GNU Lib C documentation on getcwd()...
此函数的 GNU C 库版本还允许您为缓冲区参数指定空指针。然后 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;
}
}
这对于可移植性和稳定性来说似乎很好,但它也看起来像是对所有分配和释放内存的笨拙妥协。鉴于可能会频繁调用该函数,这是否可能是性能问题?
*说“配置它”很容易,但这不能解释所有可能的系统;现在或未来。
【问题讨论】:
-
Linux 上
getpwd的实际glibc 实现实际上并没有使用手册中描述的实现。相反,它分配一个缓冲区,该缓冲区是相应 Linux 系统调用支持的最大可能路径名。如果失败,则 glibc 实现将退回到通过..目录条目向上目录树向上的传统方法。
标签: c performance getcwd