将两个缓冲区合二为一

时间:2011-10-18 19:53:39

标签: c embedded buffer buffer-overflow

我需要有两个缓冲区(AB),当其中一个缓冲区已满时,需要将其内容写入“合并”缓冲区 - C。对于此操作,使用memcopy似乎太慢,如我在下面的问题中所述。任何见解?'

我没有尝试,但我被告知memcopy无效。这是一个嵌入式系统。 2个缓冲区。两个不同的尺寸,当它们完全愚蠢到一个普通的'C'缓冲区,这个缓冲区的尺寸比其他两个更大..不知道为什么我的评分会下降..

编辑:缓冲区A和B将在C完全为空之前写入。

memcopy 耗时太长,公共缓冲区“C”已经过度运行。

2 个答案:

答案 0 :(得分:9)

memcpy几乎是复制内存的最快方法。它通常是编译器内在的并且是高度优化的。如果它太慢,你可能不得不寻找另一种方法来加速你的程序。

我希望更快地复制内存并不是程序中最低端的成果。

其他一些机会可能是复制较少的内存或较少复制。看看你是否可以对你的程序进行分析,以分析它的性能,并找出最大的机会。

编辑:通过编辑,听起来问题是,在您发现需要处理的时间和更多数据进入的时间之间,您没有足够的时间处理一些数据。正如其中一位评论者指出的那样,在这种情况下,解决方案可以提供额外的缓冲区,您可以在其间进行切换。因此,您可以有时间处理数据,而另一个数据则填满。

答案 1 :(得分:4)

在没有memcpy的情况下合并两个缓冲区的唯一方法是链接它们,就像缓冲区片段(或片段数组)的链接列表一样。

考虑缓冲区可能并不总是必须是连续的。我已经完成了600dpi图像的大量工作,这意味着非常大的缓冲区。如果你可以将它们分解成一系列较小的片段,这有助于减少碎片以及由于缓冲区增长而导致的不必要的复制。

在某些情况下,如果您的API /微控制器强制要求,缓冲区必须是连续的。例如,Windows位图功能需要连续性。您可以尝试使用C realloc函数,但它可能在内部工作,就像malloc + memcpy + free的组合一样。无论哪种方式,正如其他人之前所说,memcpy应该是复制连续缓冲区的最快方法。

如果缓冲区必须是连续的,您可以保留一个大的地址空间并按需提交。实施取决于平台。例如,在Win32上VirtualAlloc函数可以做到这一点。这为您提供了一个非常大的连续缓冲区,其中只分配了一部分(已提交)。稍后您可以提交更多页面,因为缓冲区需要增长。这个技巧需要虚拟内存的概念,这可能在微控制器上无法使用。