首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Linux中,kmemdup_nul()和kstrn心得()有什么区别?

在Linux中,kmemdup_nul()和kstrn心得()有什么区别?
EN

Stack Overflow用户
提问于 2020-03-13 10:10:54
回答 1查看 213关注 0票数 2

它们是相似的功能,但它们之间的确切区别是什么?Linux文档声明:

注意:如果大小是确切的,请使用kmemdup_nul()代替.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-14 01:18:28

这两个函数都通过kmalloc()分配所需的内存,然后在分配的缓冲区的末尾放置一个NUL终止符。两者之间唯一的区别是,kstrndup()首先调用strnlen()来计算字符串的长度和所需的大小,从而扫描字符串。

您可以看到kmemdup_nul()kstrndup()的优化版本。如果您已经知道字符串的长度,则可以避免初始扫描,只需使用传入长度的kmemdup_nul()作为参数。这节省了时间,因为字符串不需要被扫描,这也是你看到那个便条的原因。

此外,如果字符串比max短,那么max可以节省空间,因此如果您不知道字符串的长度,即使kmemdup_nul()也能工作,您可能需要调用kstrndup()来节省空间。

从代码中可以清楚地看到,这两个函数之间唯一的区别是对strnlen()的调用。这是来自mm/util.c的源代码

代码语言:javascript
复制
/**
 * kstrndup - allocate space for and copy an existing string
 * @s: the string to duplicate
 * @max: read at most @max chars from @s
 * @gfp: the GFP mask used in the kmalloc() call when allocating memory
 *
 * Note: Use kmemdup_nul() instead if the size is known exactly.
 *
 * Return: newly allocated copy of @s or %NULL in case of error
 */
char *kstrndup(const char *s, size_t max, gfp_t gfp)
{
    size_t len;
    char *buf;

    if (!s)
        return NULL;

    len = strnlen(s, max);
    buf = kmalloc_track_caller(len+1, gfp);
    if (buf) {
        memcpy(buf, s, len);
        buf[len] = '\0';
    }
    return buf;
}
EXPORT_SYMBOL(kstrndup);

/**
 * kmemdup_nul - Create a NUL-terminated string from unterminated data
 * @s: The data to stringify
 * @len: The size of the data
 * @gfp: the GFP mask used in the kmalloc() call when allocating memory
 *
 * Return: newly allocated copy of @s with NUL-termination or %NULL in
 * case of error
 */
char *kmemdup_nul(const char *s, size_t len, gfp_t gfp)
{
    char *buf;

    if (!s)
        return NULL;

    buf = kmalloc_track_caller(len + 1, gfp);
    if (buf) {
        memcpy(buf, s, len);
        buf[len] = '\0';
    }
    return buf;
}
EXPORT_SYMBOL(kmemdup_nul);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60668516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档