内存缓存是简单的在内存进行读写操作的一种传输,任何时候想在上面写入数据都是放入缓存中, 任何时候读操作数据也是来至于缓存。内存缓存的分配使用c语言的malloc类函数,分配的长度是需要 长度的两倍,需要考虑这些内存缓存的使用范围。
同样这个类继承至缓存基类TBufferBase,默 认的缓存大小是1024(static const uint32_t defaultSize = 1024;),所有的构造函数都调用函数 initCommon,这个函数实现如下:
voidinitCommon(uint8_t* buf, uint32_t size, bool owner, uint32_t wPos) { if (buf== NULL && size != 0) {//如果传递过来的buf为null并且size不为0 assert(owner);//断言这个内存缓存是不是自己所有,不是就报错不继续执行后面的代码了 buf =(uint8_t*)std::malloc(size);//是自己拥有的内存缓存就自己分配size大小的内存作为缓存 if(buf == NULL) { throw std::bad_alloc();//分配失败抛出异常 } } buffer_= buf;//初始化缓存成员变量 bufferSize_ = size;//大小 rBase_= buffer_;基地址 rBound_= buffer_ + wPos;//界限 wBase_= buffer_ + wPos;//写缓存基地址 wBound_= buffer_ + bufferSize_;//写界限 owner_= owner;//是否自己拥有这段内存缓存 }
上面代码需要说明是:在初始化这个类的时候对于内存缓存是不是属于类自己拥有有不同 的处理方式,后面介绍各个方针;还有一点就是读的边界其实就是写的起始地址,因为写入开始的地方 就是没有有效数据的地方了,就是一个生存者和消费者的问题,这个后面介绍的一个函数computeRead 会更新相关内容。下面我们就看看内存缓存采取的几种可配置的方针(对待内存缓存的方式),是定义 一个枚举标识每一个方针的,定义如下:
enumMemoryPolicy { OBSERVE= 1 , COPY =2 ,TAKE_OWNERSHIP = 3 };
下面分配分析这三种方针,第一种称为观察方针,意思是内存缓存传输类只是简单的存储 一个指针存放到内存,它是调用者来保证内存缓存在剩余的时间指向一个有效的内存,并且在适当的时 候清理它(注意:这种内存缓存是不允许写入数据的);第二种是内存缓存类内部的一种拷贝,调用者 无任何责任;最后一种就是内存缓存类自己拥有的内存缓存,这个必须自己释放,并且在使用以前需要 使用malloc分配。明白了三种内存方针了,就知道什么时候需要的是哪一种。内存使用方针除了被构造 函数使用以外,我们在重置内存缓存区时也会使用到,而重置缓存函数是resetBuffer,有两个函数重 载。在实现重载函数的时候使用了一点点优化手段,就是交换内存的时候使用std::swap,这个函数的 好处就是如果是相同的内存分配器分配的就直接交换指针头就可以了。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索内存
, 函数
, 缓存
, 一个
, 缓存类
, 分配
内存缓存
thrift ttransport、protobuffer thrift、thrift buffer、direct buffer memory、kafka buffer.memory,以便于您获取更多的相关知识。