【发布时间】:2021-04-27 06:11:10
【问题描述】:
我有一个 uint8_t 值数组,我的目标是每 3 个字节复制一个 dst 数组,但问题是我在 dst 数组中从 4 个字节迭代到 4 个字节,如下所示。
src = {1,2,3,4,5,6};
dst = {0,0,0,0,0,0,0,0};
...
dst = {1,2,3,0,4,5,6,0}
现在我正在使用以下代码来执行此任务。
for(int i=0; i<arr_size ; i++)
memcpy(dst + i*4, arr_ptr + i*3, 3);
有没有更快/更有效的方法来做到这一点?
编辑以获取更多上下文:
我有以下结构,需要用图像数组中的数据填充,其中a 将始终用 0 初始化。
typedef struct {unsigned char r,g,b,a} uchar4;
...
// init dst
...
*dst = (uchar4 *)malloc(height * width * sizeof(uchar4));
通过为 uchar4 数组赋值struct.variable = value,需要很多时间,这让我认为将存储 uint8_t 值的图像数组中的值复制到 uchar4 数组会更快, 因为 uchar 和 uint8 在内存中占用 1 个字节。这样,structs 数组用 0 初始化,扁平图像中的每 3 个字节在 uchar arr 中每 4 个字节粘贴一次。
Edit2:代码更正
【问题讨论】:
-
这似乎更适合the Code Review SE。
-
@Someprogrammerdude 在建议用户在 CR 上发帖时,如果还有类似“请阅读相关帮助中心页面,例如 'What topics can I ask about here?' 和 'How do I ask a good question?”。在当前的形式中,上面的代码可能会因为题外话而被关闭,因为它经常发生is missing context。
-
memcpy(dst + i*3, arr_ptr + i*4, 3);它不会像你想象的那样做 -
是的,我认为您在
memcpy中将 3 和 4 颠倒了。而且我不认为arr_size是循环的正确上限。但我强烈怀疑,即使是没有memcpy的幼稚实现,就像 Erdal 的回答一样,也会被一个体面的编译器很好地优化。 -
@SᴀᴍOnᴇᴌᴀ 从好的方面来说,一些程序员老兄确实链接到 CR 的“我可以在这里询问哪些主题?”而不是主要的 CR 页面。我通常会做同样的事情(让提问者更有可能看到该页面)。
标签: c++ c memory memory-management