最近在做音频处理相关的工作,简单地说,是对一帧一帧数据进行编解码,有的音频格式的一帧数据大小不确定,比如aac,常常需要处理未知大小的一段数据。
使用静态数组的话,大小不好确定,也不利于根据需求变化进行扩展,目前机器的内存都比较大,但还是要合理利用内存,避免浪费;而动态分配,频繁的内存分配/释放容易产生内存碎片,影响程序效率。
对于上述情况,自己写了一个动态buffer,目前接口不是很完善,有需要的时候再添加。
/**
*
* filename: Buffer.h
* summary: dynamic buffer
* author: caosiyang
* email: csy3228@gmail.com
*
*/
#ifndef __BUFFER_H__
#define __BUFFER_H__
#include <iostream>
#include <assert.h>
using namespace std;
class Buffer {
public:
Buffer() : _buffer(NULL), _index(0), _length(0), _left(0), _initlen(102400), _incrlen(20480) {
assert(0 == _init());
}
//recommended
Buffer(const int32_t initlen, const int32_t incrlen) : _buffer(NULL), _index(0), _length(0), _left(0), _initlen(initlen), _incrlen(incrlen) {
assert(0 == _init());
}
~Buffer() {
if (_buffer) {
_free();
}
}
//reinitialize
int32_t Reinit(const int32_t initlen, const int32_t incrlen) {
_initlen = initlen;
_incrlen = incrlen;
return _init();
}
//copy data to buffer
int32_t Fill(const char *buf, const int32_t buflen) {
if (!_buffer) { //NULL pointer
return -1;
}
while (_left < buflen) {
char *p = (char *)realloc(_buffer, (_length + _incrlen) * sizeof(char));
if (p) {
_buffer = p;
_length += _incrlen;
_left += _incrlen;
//cout << "realloc() done" << endl;
} else {
//cerr << "realloc() failed" << endl;
}
}
memcpy(_buffer + _index, buf, buflen);
_index += buflen;
_left -= buflen;
return 0;
}
//get pointer of buffer
const char* Data() const {
return _buffer;
}
//get length of data in buffer
const int32_t Length() const {
return _index;
}
//print buffer status
void Status() const {
cout << "buffer status:" << endl;
cout << "_initlen = " << _initlen << endl;
cout << "_incrlen = " << _incrlen << endl;
cout << "_index = " << _index << endl;
cout << "_left = " << _left << endl;
cout << "_length = " << _length << endl;
cout << endl;
}
//set buffer's bytes to 0
void Clean() {
if (_buffer) {
memset(_buffer, 0, _length);
_index = 0;
_left = _length;
}
}
private:
Buffer(const Buffer &buffer);
Buffer& operator=(const Buffer &rhs);
char *_buffer;
int32_t _index; //current position
int32_t _length; //total length
int32_t _left; //length of available buffer
int32_t _initlen; //initial length
int32_t _incrlen; //increment length
//init buffer
int32_t _init() {
//avoid memory leak
if (_buffer) {
_free();
}
if (_initlen <= 0 || _incrlen <= 0) {
return -1;
}
_buffer = (char *)malloc(_initlen * sizeof(char));
if (!_buffer) {
cerr << "malloc() failed" << endl;
return -1;
}
_length = _initlen;
_index = 0;
_left = _initlen;
return 0;
}
//free buffer
void _free() {
free(_buffer);
_buffer = NULL;
_length = 0;
_index = 0;
_left = 0;
}
};
#endif /*__BUFFER_H__*/
From http://www.cnblogs.com/caosiyang/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?