gpt4 book ai didi

c - C 标准中不包含 strdup 的理由是什么?

转载 作者:太空狗 更新时间:2023-10-29 16:40:56 25 4
gpt4 key购买 nike

大多数 C 程序员都熟悉 strdup 函数。他们中的许多人认为这是理所当然的,但它不是 C 标准的一部分(C89、C99 和 C11 都不是)。它是 POSIX 的一部分,可能不适用于所有环境。事实上,Microsoft 坚持将其重命名为 _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) 解释了在标准库中使用 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它强调低碎片和并发性,甚至是成熟的垃圾收集器,如 The Boehm-Demers-Weiser conservative garbage collector .这些库提供 malloc/free 实现,旨在专门用于替换 <stdlib.h> 中的标准 *alloc 和 free 函数。不破坏与 C 标准库其余部分的兼容性。

因此,如果 strdup 成为标准,那么使用第三方内存管理函数的代码将有效地取消使用它的资格(必须注意,上述 jemalloc 库确实提供了 strdup 的实现来避免这个问题)。

更一般地说,虽然 strdup 确实是一个实用函数,但它的语义不够清晰。它是在 <string.h> 中声明的函数 header ,但调用它需要通过调用 free 释放返回的缓冲区来自 <stdlib.h> 的函数 header 。那么,它是字符串函数还是内存函数?
将其保留在 POSIX 标准中似乎是避免使 C 标准库变得不那么清晰的最合理解决方案。

关于c - C 标准中不包含 strdup 的理由是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32944390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com