levelDB源码分析(内存池)

来源:互联网 发布:华硕网络视频电话 编辑:程序博客网 时间:2024/04/29 08:03
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.// Use of this source code is governed by a BSD-style license that can be// found in the LICENSE file. See the AUTHORS file for names of contributors.#ifndef STORAGE_LEVELDB_UTIL_ARENA_H_#define STORAGE_LEVELDB_UTIL_ARENA_H_#include <vector>#include <assert.h>#include <stddef.h>#include <stdint.h>namespace leveldb {class Arena { public:  Arena();  ~Arena();  // Return a pointer to a newly allocated memory block of "bytes" bytes.  char* Allocate(size_t bytes);  // Allocate memory with the normal alignment guarantees provided by malloc  char* AllocateAligned(size_t bytes);  // Returns an estimate of the total memory usage of data allocated  // by the arena (including space allocated but not yet used for user  // allocations).  // 返回当前占用的内存,包括block以及std::vector占用  size_t MemoryUsage() const {    return blocks_memory_ + blocks_.capacity() * sizeof(char*);  } private:  char* AllocateFallback(size_t bytes); // 如果旧的block空间不够,则申请一个新的block  char* AllocateNewBlock(size_t block_bytes);  // 申请一个新的block  // Allocation state  char* alloc_ptr_;   //当前空闲block地址  size_t alloc_bytes_remaining_;  //当前空闲的block剩余内存大小  // Array of new[] allocated memory blocks  std::vector<char*> blocks_; //已经申请的block的地址集合  // Bytes of memory in blocks allocated so far  size_t blocks_memory_;   //已经申请的所有block的内存大小  // No copying allowed  Arena(const Arena&);  void operator=(const Arena&);};inline char* Arena::Allocate(size_t bytes) {  // The semantics of what to return are a bit messy if we allow  // 0-byte allocations, so we disallow them here (we don't need  // them for our internal use).  assert(bytes > 0);  if (bytes <= alloc_bytes_remaining_) {//检查当前的block是否可以分配,如果可以,直接分配    char* result = alloc_ptr_;    alloc_ptr_ += bytes;    alloc_bytes_remaining_ -= bytes;    return result;  }  return AllocateFallback(bytes);}}  // namespace leveldb#endif  // STORAGE_LEVELDB_UTIL_ARENA_H_
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.// Use of this source code is governed by a BSD-style license that can be// found in the LICENSE file. See the AUTHORS file for names of contributors.#include "util/arena.h"#include <assert.h>namespace leveldb {static const int kBlockSize = 4096;Arena::Arena() {  blocks_memory_ = 0;  alloc_ptr_ = NULL;  // First allocation will allocate a block  alloc_bytes_remaining_ = 0;}Arena::~Arena() {  for (size_t i = 0; i < blocks_.size(); i++) {    delete[] blocks_[i];  }}char* Arena::AllocateFallback(size_t bytes) {  if (bytes > kBlockSize / 4) {  //Èç¹û´óÓÚkBlockSizeµÄ1/4£¨1K£©£¬ÔòÖ±½Ó·ÖÅäÄÚ´æ    // Object is more than a quarter of our block size.  Allocate it separately    // to avoid wasting too much space in leftover bytes.    char* result = AllocateNewBlock(bytes);    return result;  }  // We waste the remaining space in the current block.  alloc_ptr_ = AllocateNewBlock(kBlockSize);  //°´kBlockSize£¨4k£©·ÖÅäÄڴ棬Ȼºóµ÷ÕûÖ¸Õë  alloc_bytes_remaining_ = kBlockSize;  char* result = alloc_ptr_;  alloc_ptr_ += bytes;  alloc_bytes_remaining_ -= bytes;  return result;}char* Arena::AllocateAligned(size_t bytes) {  const int align = (sizeof(void*) > 8) ? sizeof(void*) : 8;  assert((align & (align-1)) == 0);   // Pointer size should be a power of 2  size_t current_mod = reinterpret_cast<uintptr_t>(alloc_ptr_) & (align-1);  // ¼ì²éµ±Ç°µÄµØÖ·ÊÇ·ñ¶ÔÆä  size_t slop = (current_mod == 0 ? 0 : align - current_mod);  //µ±Ç°µØַû¶ÔÆ䣬ÐèÒªµ÷Õû£¬slopΪÐèÒªµ÷ÕûµÄ×Ö½ÚÊý  size_t needed = bytes + slop; //¶ÔÆäºóÕæÕýÐèÒªÉêÇëµÄÄÚ´æ´óС  char* result;  //内存充足时直接分配  if (needed <= alloc_bytes_remaining_) {    result = alloc_ptr_ + slop;  //ÄÚ´æ¶ÔÆäºóµÄµØÖ·    alloc_ptr_ += needed;    alloc_bytes_remaining_ -= needed;  } else {    //内存不足时重新分配    // AllocateFallback always returned aligned memory    result = AllocateFallback(bytes);  }  assert((reinterpret_cast<uintptr_t>(result) & (align-1)) == 0);   return result;}//分配固定大小的内存放到vector里面char* Arena::AllocateNewBlock(size_t block_bytes) {  char* result = new char[block_bytes];  blocks_memory_ += block_bytes;  blocks_.push_back(result);  return result;}}  // namespace leveldb



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 枪火游侠闪退怎么办 欧卡2气压过低怎么办 微信安装包己损坏怎么办 qq超市金币累计满了怎么办 我该怎么办?欠了那么多钱? 枪神王座被检测怎么办 酷派大神x7刷机出1004怎么办 水鬼捞锤塌方了怎么办 请事假领导不批怎么办 要请假领导不批怎么办 有急事请假不批怎么办 员工要请假不批怎么办 普法知识竞赛要重新参与怎么办 我被当兵的打怎么办 头发没了一小块怎么办 改革怎么看我该怎么办 笔记本电脑卡死了怎么办关不了机 电脑卡死了怎么办关不了机 火车上别人占座怎么办 火车上遇到占座怎么办 青少年体力差容易疲劳怎么办 四年级的孩子作业拖拉怎么办 四年级孩子不写作业怎么办 四年级孩子不爱写作业怎么办 四年级的孩子写作业慢怎么办 四年级孩子不想写作业怎么办 四年级孩子写作业特别慢怎么办 6岁儿童睡眠少怎么办 四岁儿童睡眠少怎么办 因睡眠不足第二天没有精神怎么办 睡时间久了头疼怎么办 睡不踏实老醒怎么办 运动过后大腿肌肉酸痛怎么办 牛奶喝多了想吐怎么办 运动过度后吐了怎么办 喝酒后反胃想吐怎么办 拔牙后反胃想吐怎么办 健身完恶心想吐怎么办 锻炼后头晕想吐怎么办 高三学生睡眠不好怎么办 狗狗精力太旺盛怎么办