C 将两个缓冲区合并为一个缓冲区

C 将两个缓冲区合并为一个缓冲区,c,embedded,buffer,buffer-overflow,C,Embedded,Buffer,Buffer Overflow,我需要有两个缓冲区(A和B),当其中一个缓冲区已满时,它需要将其内容写入“合并”缓冲区-C。正如我在下面的问题中提到的,使用memcopy似乎太慢了。有什么见解吗?” 我还没试过,但有人告诉我memcopy不行。这是一个嵌入式系统。2个缓冲区。这两个缓冲区的大小都不同,并且当它们完全哑到一个比其他两个缓冲区大的通用“C”缓冲区时。。我不知道为什么我会被降级 编辑:缓冲区A和B将在C完全为空之前写入 memcopy占用的时间太长,公共缓冲区“C”正在溢出 memcpy几乎是复制内存的最快方式。它通

我需要有两个缓冲区(
A
B
),当其中一个缓冲区已满时,它需要将其内容写入“合并”缓冲区-
C
。正如我在下面的问题中提到的,使用memcopy似乎太慢了。有什么见解吗?”

我还没试过,但有人告诉我memcopy不行。这是一个嵌入式系统。2个缓冲区。这两个缓冲区的大小都不同,并且当它们完全哑到一个比其他两个缓冲区大的通用“C”缓冲区时。。我不知道为什么我会被降级

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


memcopy占用的时间太长,公共缓冲区“C”正在溢出

memcpy几乎是复制内存的最快方式。它通常是编译器的固有特性,并且经过高度优化。如果速度太慢,你可能必须找到另一种方法来加速你的程序

我认为更快地复制内存并不是程序中最容易实现的结果

其他一些机会可能是复制更少的内存或更少的复制次数。看看你是否能分析你的程序,分析它的性能,找出最大的机会在哪里


编辑:通过编辑,问题似乎在于,从您注意到需要处理某些数据到收到更多数据之间,没有足够的时间一次性处理这些数据。正如一位评论者所指出的,这种情况下的一个解决方案可能是拥有额外的缓冲区,您可以在这些缓冲区之间切换。因此,当另一个缓冲区被填满时,您可能有时间处理其中的数据。

在不使用
memcpy
的情况下合并两个缓冲区的唯一方法是将它们链接起来,就像缓冲区片段的链接列表(或片段数组)

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

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


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

合并的缓冲区是否需要是数据的副本,或者缓冲区是否可以引用其他缓冲区。如何合并它们?这三种尺寸都是固定的吗?缓冲区<代码> c>代码>是C++类吗?缓冲区
A
会在
C
清空之前写入吗?告诉我们你尝试了什么,遇到了什么问题。@TomalakGeret'kal:Ha你在同一时间进行了我完全相同的编辑:)双缓冲,伙计。翻转指针。