C 标准中不包含 strdup 的理由是什么?
What is the rationale for not including strdup in the C Standard?
大多数 C 程序员都熟悉 strdup
函数。他们中的许多人认为这是理所当然的,但它不是 C 标准的一部分(C89、C99 和 C11 都不是)。它是 POSIX 的一部分,可能并非在所有环境中都可用。事实上,微软坚持要重命名它 _strdup
,增加了混乱。
这样定义它很容易(在 C 中):
#include <string.h>
char *strdup(const char *s) {
size_t size = strlen(s) + 1;
char *p = malloc(size);
if (p) {
memcpy(p, s, size);
}
return p;
}
但即使是精明的程序员也很容易出错。
此外,仅在没有该功能的系统上重新定义功能证明有点复杂,如下所述:strdup() function
为什么不在 C 标准的修订版中包含如此有用且广泛支持的函数? C99的C标准库中加入了很多新函数,为什么不包含strdup
?
评论(http://open-std.org/JTC1/SC22/WG14/www/docs/n718.htm)中引用的link解释了"wrong"标准库中的strdup:
The major issue was the desirability of adding a function to the standard library which allocates heap memory automatically for the user.
基本上,C 语言及其标准库尽量不对用户如何分配和使用内存做出假设。
它提供了一些设施,其中包括堆栈和堆。
虽然 malloc/free 是动态内存分配的标准化方法,但它们绝不是唯一的方法,因为动态内存管理是一个非常复杂的主题,默认的分配策略可能并不适合所有人各种应用程序。
例如有一些独立的库,例如jemalloc which emphasizes low fragmentation and concurrency, or even full-fledged garbage collectors such as The Boehm-Demers-Weiser conservative garbage collector。
这些库提供 malloc/free 实现,旨在专门用于替换 <stdlib.h>
中的标准 *alloc 和免费函数,而不会破坏与 C 标准库其余部分的兼容性。
因此,如果 strdup 成为标准,使用 third-party 内存管理函数的代码将有效地取消使用它的资格(必须注意,上述 jemalloc 库确实提供了 strdup 的实现以避免这种情况问题)。
更一般地说,虽然 strdup 确实是一个实用函数,但它的语义不够清晰。它是在 <string.h>
header 中声明的函数,但调用它需要通过从 <stdlib.h>
header 调用 free
函数来释放返回的缓冲区。那么,到底是字符串函数还是记忆函数呢?
将它保留在 POSIX 标准中似乎是避免使 C 标准库变得不那么清晰的最合理解决方案。
大多数 C 程序员都熟悉 strdup
函数。他们中的许多人认为这是理所当然的,但它不是 C 标准的一部分(C89、C99 和 C11 都不是)。它是 POSIX 的一部分,可能并非在所有环境中都可用。事实上,微软坚持要重命名它 _strdup
,增加了混乱。
这样定义它很容易(在 C 中):
#include <string.h>
char *strdup(const char *s) {
size_t size = strlen(s) + 1;
char *p = malloc(size);
if (p) {
memcpy(p, s, size);
}
return p;
}
但即使是精明的程序员也很容易出错。
此外,仅在没有该功能的系统上重新定义功能证明有点复杂,如下所述:strdup() function
为什么不在 C 标准的修订版中包含如此有用且广泛支持的函数? C99的C标准库中加入了很多新函数,为什么不包含strdup
?
评论(http://open-std.org/JTC1/SC22/WG14/www/docs/n718.htm)中引用的link解释了"wrong"标准库中的strdup:
The major issue was the desirability of adding a function to the standard library which allocates heap memory automatically for the user.
基本上,C 语言及其标准库尽量不对用户如何分配和使用内存做出假设。
它提供了一些设施,其中包括堆栈和堆。
虽然 malloc/free 是动态内存分配的标准化方法,但它们绝不是唯一的方法,因为动态内存管理是一个非常复杂的主题,默认的分配策略可能并不适合所有人各种应用程序。
例如有一些独立的库,例如jemalloc which emphasizes low fragmentation and concurrency, or even full-fledged garbage collectors such as The Boehm-Demers-Weiser conservative garbage collector。
这些库提供 malloc/free 实现,旨在专门用于替换 <stdlib.h>
中的标准 *alloc 和免费函数,而不会破坏与 C 标准库其余部分的兼容性。
因此,如果 strdup 成为标准,使用 third-party 内存管理函数的代码将有效地取消使用它的资格(必须注意,上述 jemalloc 库确实提供了 strdup 的实现以避免这种情况问题)。
更一般地说,虽然 strdup 确实是一个实用函数,但它的语义不够清晰。它是在 <string.h>
header 中声明的函数,但调用它需要通过从 <stdlib.h>
header 调用 free
函数来释放返回的缓冲区。那么,到底是字符串函数还是记忆函数呢?
将它保留在 POSIX 标准中似乎是避免使 C 标准库变得不那么清晰的最合理解决方案。