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位图函数需要连续性。您可以尝试使用Crealloc
函数,但它在内部的工作方式可能类似于malloc
+memcpy
+free
的组合。无论哪种方式,正如其他人之前所说,memcpy
都被认为是复制连续缓冲区的最快方式
如果缓冲区必须是连续的,您可以保留一个较大的地址空间,并按需提交。实现依赖于平台。例如,在Win32上,
VirtualAlloc
函数可以做到这一点。这将提供一个非常大的连续缓冲区,其中只有一部分被分配(提交)。稍后,随着缓冲区的增长,您可以提交更多页面。这个技巧需要虚拟内存的概念,这在微控制器上可能不可用。合并的缓冲区是否需要是数据的副本,或者缓冲区是否可以引用其他缓冲区。如何合并它们?这三种尺寸都是固定的吗?缓冲区<代码> c>代码>是C++类吗?缓冲区A
会在C
清空之前写入吗?告诉我们你尝试了什么,遇到了什么问题。@TomalakGeret'kal:Ha你在同一时间进行了我完全相同的编辑:)双缓冲,伙计。翻转指针。