将两个缓冲区合二为一

Que*_*eer 0 c embedded buffer buffer-overflow

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

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

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

存储器复制的时间过长和公共缓冲"C"越来越超限.

bam*_*s53 9

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

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

其他一些机会可能是复制较少的内存或较少复制.看看您是否可以分析您的程序以分析其性能并找出最大的机会.

编辑:通过编辑,听起来问题是你没有足够的时间在你注意到它需要处理的时间和更多数据进入的时间之间同时处理一些数据.这个解决方案正如一位评论者指出的那样,案例可能会有额外的缓冲区,您可以在其间进行切换.因此,您可以有时间处理数据,而另一个数据填满.


Tam*_*jen 5

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

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

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

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