【发布时间】:2018-01-17 20:05:29
【问题描述】:
我有一个关于 memcpy 的问题。我有一个缓冲区,想将数据从缓冲区的后端移动到前端。像这样的:
int buffer[100];
memcpy(buffer, buffer + 10, 30);
存在重叠数据(元素 11 - 21),是否会丢失数据或将数据复制到前面?这是一个“好习惯”吗?
背景:我在微控制器上有一个大缓冲区,不想重新分配这个缓冲区。它是一个先进先出缓冲区,每次读取某些内容时,后面的数据都会移动到前面。我这样做是为了避免微控制器上的内存碎片。
【问题讨论】:
-
当缓冲区重叠时使用
memmove -
顺便说一句,通过查看
man memcpy,这样的问题通常更快得到解决。 -
manual page 对
memcpy的表述非常清楚:memcpy()函数将n字节从内存区域src复制到内存区域dest。 内存区域不能重叠。如果内存区域重叠,请使用memmove(3)。这实际上是对函数的完整描述。 -
在速度方面,“每次读到东西,后面的数据都会移到前面”。听起来那是真正的性能问题。这听起来肯定是错误的设计选择。我建议重新检查设计,而不是担心
memcpy()、memmove()与精心设计的代码的微优化。 -
在我的情况下,速度并不重要