如何使用 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;
}
现在,假设 dest
是 char*
类型,而不是写
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 的要求,我将提供有关 restrict
和 inline
优化的更多信息:
可以通过更改函数原型以使用 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
关键字的理由更少了。
基本上我需要做多个 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;
}
现在,假设 dest
是 char*
类型,而不是写
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 的要求,我将提供有关 restrict
和 inline
优化的更多信息:
可以通过更改函数原型以使用 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
关键字的理由更少了。