我正在尝试将mp4视频解码为YUV帧。我想为每个要解码的帧分配内存,如果我连续分配内存并释放它可以吗?这样做有问题吗(即,使用malloc
和free
有争议地分配和释放内存)?
我最好一次分配足够的缓冲区并重用相同的缓冲区。除了一些性能上的成功,重复的malloc免费不会带来任何问题。
从技术上讲,只要不尝试访问已经释放的内存,这根本没有问题。
另一方面,重复进行所有这些调用会产生一种开销,您可以(也应该)通过提前分配足够的内存,然后在最后释放所有内存来避免这种开销。
只有在内存限制非常严格的情况下,才应该使用重复分配/释放的方法,否则,请保留一大块内存,并根据自己的需要分配部分内存。或者,如果可能的话,重用相同的内存块。
更新:正如@EricPostpischil在一条有用的评论中提到的(见下文),malloc是一个库调用,而不是一个只有在当前堆耗尽时才会发生的系统调用。有关此方面的更多信息,请参阅以下解释
如果分配的对象大小相同,那么性能应该不会受到太大影响。如果有疑问,请测量。
正确跟踪分配的内存通常不是一件小事,因此分配一次缓冲区并在整个程序中使用它可能更容易。但这里的主要规则应该是使用与程序逻辑相对应的、最容易阅读和维护的内容。
不断地对is进行mallocing和释放不会破坏程序,但会导致很多性能问题,尤其是因为你说你要在每帧都这样做。经常会造成明显的性能下降。
您所能做的只是对内存进行一次malloc,然后对每个帧重复使用相同的分配。如果在读取下一帧之前,在对帧执行了所需操作之后不需要存储内存,则没有任何问题。