如何使用 memcpy() 自动增加目标指针?

How to auto increment the destination pointer with memcpy()?

基本上我需要做多个 memcpy() 并且我不想在每次 memcpy() 调用后增加目标指针 dst++;.. 只是想知道如何节省一些编码时间.

memcpy(dest, src1, 1); // uint8_t
dest += 1;
memcpy(dest, src2, 2); // uint16_t
dest += 2;
memcpy(dest, src3, 1024); // uint8_t*
dest += 1024;
...

如何执行多个 memcpy() 来增加目标指针?

编写自己的函数。

例如,对于任何尺寸的元素都是通用的:

void *generic(void *dest, const void *src, const size_t elemsize, size_t nelems)
{
    char *cptr = dest;

    memcpy(dest, src, elemsize * nelems);
    cptr += nelems * elemsize;
    return cptr;
}

或如您的示例(字符大小元素)

void *charSizeOnly(void *dest, const void *src, size_t nelems)
{
    char *cptr = dest;

    memcpy(dest, src, nelems);
    cptr += nelems;
    return cptr;
}

用法示例:

    mytype *dest;
    mytype *src;
    /* ... some code*/
    /*it will copy and update the dest by 30 elements of type `mytype`*/
    dest = generic(dest, src, sizeof(*dest), 30); 

你可以做一个函数:

void memcpy_auto_inc( char **pp_dest, const void *src, size_t count )
{
    memcpy( *pp_dest, src, count );
    *pp_dest += count;
}

现在,假设 destchar* 类型,而不是写

memcpy( dest, src1, 1 );
dest += 1;
memcpy( dest, src2, 2 );
dest += 2;
memcpy( dest, src3, 1024 );
dest += 1024;

你可以这样写:

memcpy_auto_inc( &dest, src1, 1 );
memcpy_auto_inc( &dest, src2, 2 );
memcpy_auto_inc( &dest, src3, 1024 );

但是,我怀疑这样做是否值得,因为它使代码不那么清晰并且不会为您节省很多输入,即使您 select 函数的名称比 memcpy_auto_inc.

编辑:

根据 OP 的要求,我将提供有关 restrictinline 优化的更多信息:

可以通过更改函数原型以使用 restrict 类型限定符来进一步优化函数 memcpy_auto_inc

void memcpy_auto_inc( char *restrict *restrict pp_dest, const void *restrict src, size_t count )

也可以添加 inline 函数说明符。但是,在我看来,这不是必需的,因为这不太可能导致 运行 时间性能的提高。您通常可以依靠编译器的优化器来决定是否适合内联函数。

在这个问题中进一步讨论了这个话题:

When to use inline function and when not to use it?

然而,这个问题已有 12 年历史,编译器的优化器从那时起有了显着改进,所以现在使用 inline 关键字的理由更少了。