Newbyte Asked: 2024-11-13 01:50:09 +0800 CST2024-11-13 01:50:09 +0800 CST 2024-11-13 01:50:09 +0800 CST 有没有理由使用 GLib 中的 g_strdup 而不是 C 标准库中的 strdup? 772 我一直在开发一个用 C 编写的应用程序,它使用 GLib 并且专门针对 Linux。通常我的经验是 GLib 的实用程序很有用,并且与仅使用 C 标准库相比,通常可以使编写 C 更容易。然后我注意到g_strdup存在。阅读一些文档strdup,我没有注意到任何明显的区别,除了g_strdup指定你可以传递 NULL 而strdup没有提到它在这种情况下的行为方式。 有了这些信息,我有什么理由使用g_strdup吗strdup? c 2 个回答 Voted Vlad from Moscow 2024-11-13T02:04:17+08:002024-11-13T02:04:17+08:00 strdup从 C23 标准开始,POSIX 函数就包含在 C 中。 当将空指针作为参数传递时,函数g_strdup和具有不同的行为。在这种情况下,函数也返回空指针,而在这种情况下函数具有未定义的行为。仅当未为重复的字符串分配内存时,函数才返回空指针。strdupg_strdupstrdupstrdup 因此,最好使用标准函数strdup或 POSIX 函数strdup而不是该函数g_strdup。 无论如何,最好使用标准函数而不是实现定义的函数,除非您需要相应标准函数中不存在的函数的特殊行为,而这非常重要。 Best Answer Philip Withnall 2024-11-13T20:41:06+08:002024-11-13T20:41:06+08:00 阅读一些文档strdup,我没有注意到任何明显的区别,除了g_strdup指定你可以传递它NULL而strdup没有提到它在这种情况下如何表现。 它们NULL作为输入传递时的行为是一个区别。另一个关键区别是: g_strdup()根据 GLib 的一般分配策略,内存分配失败时将中止程序。这是因为,如果您尝试处理分配失败,则基本上不可能在小程序以外的任何程序中测试所有错误处理路径;并且在具有虚拟内存且没有预先存在的程序错误(例如分配大小计算错误)的系统上,分配失败非常罕见。 除此之外,这两个词的存在仅仅是因为它们g_strdup()比标准化形式早了strdup()几十年。 它们的实现(g_strdup(),strdup())基本相同,除了处理输入和分配失败的差异外NULL— 它们都测量输入字符串的长度,为其分配空间,然后调用memcpy()将字节复制到新分配。这不太可能改变。 一个较小的优化是g_strdup()它优化了对已知常量字符串的strlen()调用。因此,对于某些字符串来说,它将快得多。不过,没有理由 libcstrdup()将来不能做到这一点。 就我个人而言,我会选择g_strdup()避免必须单独明确处理NULL输入字符串或处理分配失败,但这对您来说是否有用取决于您的程序关于字符串是否可以通用的策略NULL,以及您的程序如何处理分配失败。
strdup
从 C23 标准开始,POSIX 函数就包含在 C 中。当将空指针作为参数传递时,函数
g_strdup
和具有不同的行为。在这种情况下,函数也返回空指针,而在这种情况下函数具有未定义的行为。仅当未为重复的字符串分配内存时,函数才返回空指针。strdup
g_strdup
strdup
strdup
因此,最好使用标准函数
strdup
或 POSIX 函数strdup
而不是该函数g_strdup
。无论如何,最好使用标准函数而不是实现定义的函数,除非您需要相应标准函数中不存在的函数的特殊行为,而这非常重要。
它们
NULL
作为输入传递时的行为是一个区别。另一个关键区别是:g_strdup()
根据 GLib 的一般分配策略,内存分配失败时将中止程序。这是因为,如果您尝试处理分配失败,则基本上不可能在小程序以外的任何程序中测试所有错误处理路径;并且在具有虚拟内存且没有预先存在的程序错误(例如分配大小计算错误)的系统上,分配失败非常罕见。除此之外,这两个词的存在仅仅是因为它们
g_strdup()
比标准化形式早了strdup()
几十年。它们的实现(
g_strdup()
,strdup()
)基本相同,除了处理输入和分配失败的差异外NULL
— 它们都测量输入字符串的长度,为其分配空间,然后调用memcpy()
将字节复制到新分配。这不太可能改变。一个较小的优化是
g_strdup()
它优化了对已知常量字符串的strlen()
调用。因此,对于某些字符串来说,它将快得多。不过,没有理由 libcstrdup()
将来不能做到这一点。就我个人而言,我会选择
g_strdup()
避免必须单独明确处理NULL
输入字符串或处理分配失败,但这对您来说是否有用取决于您的程序关于字符串是否可以通用的策略NULL
,以及您的程序如何处理分配失败。