loki之内存池SmallObj[原创]
loki库之内存池SmallObj
介绍
loki库的内存池实现主要在文件smallobj中,顾名思义它的优势主要在小对象的分配与释放上,loki库是基于策略的方法实现的,简单的说就是把某个类通过模板参数传递给主类,比如某个对象的创建可以通过不同的创建策略进行创建,本文主要讲loki的大致实现。
smallobj层次
loki.smallobj主要分四层:
- 应用层smallobject,重载了operator new 和operator delete,内存通过底层获取
- 内存分配smallobjAllocator,这一层相当C语言的malloc和free,底层由数组Loki::FixedAllocator组成,根据需要的内存大小判断调用哪一个下标的Loki::FixedAllocator
- 固定内存分配器FixAllocator,这是组成上层的基础,初始化的时候需要设置固定分配的大小blocksize*n,n对应上一层中数组的下标
- 内存块管理chunk,可以简单的理解为这就是一片连续的内存aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABr8AAAF7CAYAAABrUZBTAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdfVxUZf4//tfhHhRBBRQwUEQUNbE1lbJyxd1utMFuNG9Y121X3GHXzJLtt1uQywNW6/OBzOyTfqDPfjNCWG0rmdJqhXJ1g2wrEFMZb0EwGLxhRLmH8/vj7BxnYGa4GzjcvJ6Px3kMc865rut9jjDCvOd9XYIoiiKIiIiIiIiIiIiIiIiIBr71dkpHQERERERERERERERERGQrTH4RERERERERERERERHRoMHkFxEREREREREREREREQ0aTH4RERERERERERERERHRoOGgdABERERERERERER02+nTp3HkyBGcOHEC165dQ0NDg9IhUT9nZ2eHkSNHIigoCLNnz8a9994LJycnpcMiIlKMIIqiqHQQREREREREREREQ5lOp8OuXbvwzjvv4MKFC/D09MS0adMwatQouLi4KB0e9XOtra24fv06zp07h5KSEowYMQKPPfYYNmzYgFmzZikdHhFRX1vPyi8iIiIiIiIiIiKFNDY2YseOHUhKSoKzszN+/etf46mnnsLMmTOVDo0GqIqKCmRnZyM1NRWzZ8/GihUrkJKSAl9fX6VDIyLqM6z8IiIiIiIiIiIiUkBRURGWL1+Oixcv4vnnn8eLL74INzc3pcOiQeTDDz9EbGwsdDodUlJSsG7dOqVDIiLqC+vtlI6AiIiIiIiIiIhoqDl48CDmzZsHPz8/nDx5EklJSUx8kc09/vjjOHHiBJ5//nnExMTg+eefR0tLi9JhERH1Oia/iIiIiIiIiIiI+tDbb78NlUqFqKgofPrppxg/frzSIdEg5urqioSEBLz//vtITU3F8uXLmQAjokGPyS8iIiIiIiIiIqI+kpubi9///vfYunUrdu7cCQcHB6VD6lcEQRgQfQ5Ejz/+OA4fPox//vOf2LBhg9LhEBH1Kia/iIiIiIiIiIiI+oBWq8UTTzyBZ555Bn/4wx+UDkdRWq0W8fHxEAQBkZGRKCwsVDqkIWHWrFn429/+hrfffhu7du1SOhwiol4jiKIoKh0EERERERERERHRYCaKIubPn4+RI0figw8+gL29vdIhKUar1SI9PR3R0dEICAiAXq/HwYMHsWLFCgiCAFu/XdkbfQ50u3fvhlqtxsmTJzFhwgSlwyEisrX1rPwiIiIiIiIiIiLqZZmZmTh58iT++te/DunEFwCTxBcAeHh4YMWKFfLxwsJCREZGtqsIazt9ofFzQRAstjMWHx/PKjMAa9asgUqlwqZNm5QOhYioV7Dyi4iIiIiIiIiIqBfV1tYiNDQUf/zjHxETE6N0OIqzVoklCAJycnIQEREBrVaLbdu2YefOnWbbGT/vTLv4+HgsXboUYWFhvXyFA0NpaSlCQ0Px8ccfY8GCBUqHQ0RkS+uZ/CIiIiIiIiIiIupFr732GrZv347z588P+aovoOPkl7UEV3ePqdVqzJ8/36TCjIDnn38e+fn5+Oqrr5QOhYjIljjtIRERERERERERUW9KTU3F2rVrmfj6j7i4OJSWlvbpmGvWrMHhw4eh0+n6dNz+bt26dcjLy0NRUZHSoRAR2RSTX0RERERERERERL3k9OnTKC4uxmOPPaZ0KP3G6tWrkZaWJifA9Ho9srKyOmynVquh1WoBALm5uV0aMzw8HAkJCdixY0fXAx7EpkyZgilTpuCjjz5SOhQiIpti8ouIiIiIiIiIiKiX/POf/4SHhwfuvPNOpUPpN0JCQuQEmCAIWL16NUJDQztsp1arERsbi8jISIwePbrL4/r4+GDx4sWdSrQNJfPmzcORI0eUDoOIyKa45hcREREREREREVEHysrKcP78efj4+GDs2LHw9PTsVLvnnnsOX3/9NddUon7rtddew2uvvYaysjKlQyEispX1DkpHQERERERERERE1N9FR0fj008/lZ87OTlh1KhR8PPzg5+fH3x9feHr6wsfHx/4+vpizJgx8PHxQUVFBby8vBSMnMg6Ly8vXL16VekwiIhsiskvIiIiIiIiIiKiDtx///0mya/GxkZUVFSgoqIC3333HRwdHWFnZ4fW1lY0NTWZtOWUh9SfOTg4oL6+XukwiIhsiskvIiIiIiIiIiKiDixYsMDq8bYJL2Pjx4+3cTRERERkDZNfREREREREREREHbj77rvh4uLSqQoZR0dHCIKALVu24Ntvv4UgCH0QIRERERnYKR0AERERERERERFRf9fa2oqJEyd2mMiys7PD3XffjaKiImzatImJLyIiIgUw+UVERERERERERGTFmTNncO+99+Ls2bNwcDA/kZKjoyNcXV2xfft2HD16FCEhIX0cJRERERkw+UVERERERERERGTB119/jbvvvhuCIGD37t1m1/YSBAH33nsvfvjhB6xfvx52dnzLjYiISElc84uIiIiIiIiIiMiMwsJCPPTQQ1i0aBHeeecd2NnZmaz75ejoCCcnJ2zbtg1r167lFIdERET9BD+GQkRERERERERE1EZpaSl+/vOfY/78+di9ezecnZ3h6OiI2bNnA5CqvRYsWIDTp08jOjqaiS8iIqJ+hMkvIiIiIiIiIiIiI62trfjVr36F0NBQ7N27F05OTvKxJ598EgDwzjvv4LPPPsO4ceOUCpOIiIgs4LSHRERERERERERERl5//XV8//33OH78OJydnU2OPfvss3j22WcVioyIiIg6g8kvIiIiIiIiIiKi/ygvL0d8fDxSU1Nxxx13KB0OERERdQOnPSQiIiIiIiIiIvqPrVu34u6770ZUVJTSoRAREVE3MflFREREREREREQEoLS0FGlpaUhMTFQ6FCJqQxAECILQpXONt76m1Lgd0Wg0/TY2Ilti8ouIiIiIiIiIiAjAf/3Xf2Hu3Ll44IEHlA6FiMjmdDodIiMjlQ6DqE8w+UVERERERERERENeXV0dMjIysG7dOqVDIaIeEkVR3ui2HTt2IDs7W+kwiPoEk19ERERERERERDTkffjhh2htbcUTTzyhdChERDaXn5+PwsJCqFQqpUMh6hNMfhERERERERER0ZCXnp6OpUuXws3NTelQiKgDWVlZ8rpVaWlp0Ol0PepPr9cjKysLkZGREAQBkZGRyMrKgl6vN3t+bm4u4uPj5Rji4+Oh1Wo7HMcw7aAgCMjKyjI5VlhYiLS0NPm4IAiIiYlBVlYWSktLe3x9W7ZswYsvvtijfogGEkFk7ScREREREREREQ1hdXV1GDlyJN577z0sXbrUpn1HRUUBADIyMmzaL5Gt7NmzB1FRUf1+ikBBEAAAqamp7aYnValUSE9Ph4eHh8V21q4vMjISGo2m3X6VStVumsD4+HgkJSWZ7cd4jLbj6nQ6rF27FhqNBpmZmVixYoV8rkaj6XAtLkM/hn47YhxLSkoKqqurkZiYaDY2okFoPSu/iIiIiIiIiIhoSDt8+DCam5uxcOHCXul/z549ciUHN279bTMkaAeK0tJSVFdXQxRFVFdXIy4uDhqNBgcPHuxWf1lZWdBoNIiLizPbr3GFVm5uLpKSkqBSqVBQUCCvK1ZZWYnU1FSLYxQWFlpMfAGQE195eXlyDIY4CgoKkJyc3K1rAwCtVovY2FhER0d3uw+igYiVX0RERERERERENKRt2rQJX331FfLy8mzed1RUFEpLS7Fhwwab901kC0ePHsUbb7zR76uABEGqViopKUFAQIC8v7S0FIGBgVCr1di5c6fFdpauLyYmBrt27epUv4aqr+LiYoSEhHQq3oKCAsycORMAzCa+jGNITk7GiBEjMHHiRABAcHCwSUzdERkZiVWrVpmM29E9IRoE1jP5RUREREREREREQ1p4eDjmzZuHlJQUm/fNaQ+pvxto0x6ai7O7x7ratitJI8O5BuamUDTQ6XTYvHkzdu3a1e5YXFwcYmNjzU7p2BGNRoO0tLR24zL5RUMApz0kIiIiIiIiIqKhq7m5GcePH8ddd92ldChENEip1Wo5EWWOj48Pdu7cicrKShQUFCAnJwepqalQqVRISkrC3r175XM7O50lcHstM3PHjPsiGoyY/CIiIiIiIiIioiHr1KlTqKurw6xZs5QOhYg6obS01OxztVrdrf4M7TrTb1xcHABpHa3OKigowCuvvAKVSoV169YhPz/f4rk+Pj4ICwtDREQEoqOj5YqtdevWdXo8IpIw+UVERERERERERENWQUEB3NzcOly/h4j6h7S0NOj1egCAXq+Xq6kWLVpk9nxDwio3N9fs8fnz51vt13AcABYsWAAAiI2NRWFhobxfp9NZrOoKCwuDh4cHkpOTAQD33HMPdDqdyTnx8fHIz8832a/X683GLIpipzZr57bti2gw4ppfREREREREREQ0ZL388sv44IMPcOLEiV7pn2t+UX830Nb8Sk1NbVcJZW09La1Wi8mTJ7fbb3y9hukB2zLXb3x8PJKSksyOZdynuXW1NBoNIiMjERcXh8TExHbnWpKdnQ2VSmX1nK7gml80BHDNLyIiIiIiIiIiGrouXLiAoKAgpcMYsozXIYqPj+/SdHJcq2hoio6ORmZmpvw8NTUV6enpFs8PCQlBXl6e1WkR09PTkZmZKSeYVCoVMjMzzfabmJiInJwcuaIMkKrLiouLO4xdpVIhLi4OSUlJyMrKkvdXVlYiOzvbpE+VSoXU1FQUFBTYNPFFNFSw8ouIiIiIiIiIiIasefPm4e6778b27dt7pX9WflknCIJcfaLVapGeno7Vq1d3ahpK47bUfQOl8ouIqAtY+UVE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" alt="" />
整体结构图如下:
下面我们自低向上分析smallobj源代码。
chunk
chunk是一块连续内存数组,初始化时候内存大小已经固定,每次分配出去的内存大小也是固定的,考虑到分配的效率,它通过数组下标的方式将连续的内存链接成链表,节点个数最多为256个(用char表示大小,原因参看C++ modern design),这样达到灵活分配的目的,内存示意图如下:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAT8AAAIpCAYAAADUwT+wAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO3de1hUdeI/8PcAal5hW0UrFTUXU9fwVsKKd9taa9BaTdSwctEdKr+5yZOXHZc2rWzDfpUls1DtrjcoLZPZNinAlDYpQ6HWC1okmNaMVjOCNxQ+vz9OM3GZgQFm5jMz5/16Hh7xnM85857Ad2fOVSOEECAiUpeTQbITEBHJwPIjIlVi+RGRKoXIDuApZrMZJ0+ehNVqxfnz53H+/HmcO3cO586dQ4cOHdC5c2d07doVoaGh6Ny5M0JDQzFw4EBcc801sqMTkRf4ffn9+OOP2Lt3Lw4dOoTS0lIcPXoUx44dg8ViqTcuKCgIoaGh6Nq1Ky5fvozz58+jqqqq0Zi+ffti0KBB9q/Ro0dj1KhRCA4O9ubbIiIP0/jb0d6qqioUFBQgPz8fu3fvxsGDBxEUFIR+/fph0KBBuOmmmxAZGYlBgwahT58+6NatGzp37oyOHTs6XJ/FYrFvFR47dgylpaU4duwYjh49itLSUpw9exahoaEYP348pkyZgkmTJmHYsGHQaDRefudE5EYn/aL8Ll68iLfffhubN29Gbm4uhBAYOXIkJk+ejEmTJiE2NhadO3f2yGufOHHCXrT5+fk4ffo0evbsidmzZ2P+/PkYNWqUR16XiDzKd8uvtrYWe/bswcaNG7F9+3ZcuXIFd955J+bNm4fJkycjLCxMSq6jR49i586d2Lx5M/73v/9h8ODBuP/++zF37lz06dNHSiYiajHfK78rV65g69atWLt2LY4ePYqYmBgkJCRg9uzZuPbaa2XHq6eoqAibN2/G1q1b8f333+Pee+/FihUrMGzYMNnRiKhpJyF8xMWLF8WGDRtEv379RLt27cSDDz4oDh06JDuWS6qrq0VmZqaIiooSGo1GTJ8+XXzyySeyYxGRcxXSz/Orra1FRkYGBgwYgMceewx33nknjh07htdffx1DhgyRHc8l7dq1Q3x8PA4ePIh33nkH3333HcaMGYNp06bh6NGjsuMRkQNSy+/gwYOIjY3FQw89hFmzZuHrr7/Gyy+/jH79+smM1WoajQZxcXEoLCzEBx98AJPJhKioKKxYsQIXLlyQHY+I6pBSflarFY8++ihuvfVWBAUFoaioCC+++CJ69eolI45HTJ06FZ9++ilSU1NhMBgwePBg7Ny5U3YsIvqJ18uvoKAAv/71r7F161b8/e9/R0FBAW6++WZvx/CK4OBgLF68GEeOHMH48eNx9913Y/bs2Th37pzsaESq57Xyq62txerVqzF58mRER0ejtLQUCxYsUMXJwr169cKmTZvw/vvvY+/evRg9ejSKiopkxyJSNa+U35kzZ/C73/0OTz31FP7f//t/2LZtm8+dtuINU6dOxeeff47+/ftj7NixePnll2VHIlItj5dfUVERoqKi8PXXX+Ojjz7CI4884umX9Gk9evTAe++9hz//+c9YsmQJ5s2bh+rqatmxiFTHoyc55+fnY8aMGZg4cSI2b96Mbt26eeql/NKePXtwzz33YMSIEdixYwe6du0qOxKRWnjuTs7bt2/HtGnTcO+992LHjh0sPgcmTJiAgoICHDt2DJMmTYLJZJIdiUg1PFJ+aWlpiI+Px5IlS5CRkcHbQTVhyJAh+O9//4uLFy8iNjYWX3/9texIRKrg9o+96enpSEpKwrp167BkyRJ3rjqg/fDDD7jrrrtgMpmwZ88e9O7dW3YkokDm3hsbZGdn45577sH69euRlJTkrtWqxoULFzB58mRcuHABBQUFCA0NlR2JKFC5b5/f7t27MWfOHKxYsYLF10qdOnWC0WjEpUuXMGPGDF4SR+RBbtny++KLLzBu3DjMnTsXGzZscEcuVfvmm28QExODkSNH4u233+Y+UyL3a/vHXqvVihEjRmD48OHYtm0b/6G6ie1/KEuWLMETTzwhOw5RoGl7+c2cORPHjx9HYWGh0+dkUOvs2rULWq0Wu3btwpQpU2THIQokbdvn98orryAnJwdvvPEGi88D7rjjDiQnJ+O+++7Dd999JzsOUUBp9ZbfgQMH8Jvf/Aavvvoq7rvvPnfnop9cvXoVkyZNQocOHZCTk8PdCkTu0botv+rqatx33332L/KckJAQbN26FcXFxVi/fr3sOEQBo1Xl9/zzz6O6uhovvfSSu/OQA3369EF6ejpSUlJw6tQp2XGIAkKLP/aWl5djyJAh2L59O373u995Khc5cNddd6FLly7IysqSHYXI37X8aO+MGTMQHByMt956y1OhyImysjIMHToURqMRU6dOlR2HyJ+dDGnJ6HfffRd5eXk4dOiQpwJREwYMGICVK1fi4Ycfxueff44OHTrIjkTkt1ze51dbW4ulS5di+fLl6Nu3ryczURMef/xxVFdXIy0tTXYUIr/mcvm9+eabMJlMqr8Ts2wdOnTA448/jueeew6XL1+WHYfIb7lUfkIIPPPMM3jkkUd4pxEf8OCDD0IIgX/84x+yoxD5LZfK79///jfKysrw6KOPejoPueCaa65BcnIy/va3v+Hq1auy4xD5JZfK7+mnn8aiRYvQvXt3T+chFy1atAiVlZXYunWr7ChEfqnZU1327duH2NhYlJWVISIiwlu5yAUrVqzArl27cPDgQdlRiPxN85e3bdy4EePHj2fx+aCEhAQUFxfjf//7n+woRH6nyfK7fPky3nzzTcyfP99beagFhgwZgtGjR2Pjxo2yoxD5nSbL791338WlS5cwc+ZMb+WhFkpISMDWrVtRW1srOwqRX2my/DZu3Ii7776bD9P2YfHx8TCbzcjLy/PK65nNZmRlZSEuLs4t4zyZgahJwolz586J9u3bi507dzobQj7itttuEwsXLvTKa+l0OgFANPGr06JxraHVaj22blelp6dLfX1qswqnR3vfe+89aLVanD17FmFhYV4rY2q5tWvXIiMjA1999ZVXXk+j0QBQTn53xzhPZvCEkpISDB8+3Kuvn5eXhw8++MArrxVoOnTogJUrVza8Ft75jQ3y8/MxatQoFp8fmDx5MlasWIETJ06gX79+suMENKvViu3bt3v9dZcvX47PPvsMo0aN8vpr+7PKykocO3YMv/3tbzF27Nj6M51tE44cOVIsW7bMOxug1CZXr14VYWFh4rXXXvPK6+Gnj5wmk0mkpqYKAEKn04ny8nKH4+qyWCwiMzPTPi89PV2YTKZGr+FoXFPrzsvLs0+rO92Wz/Y6TfzKuyQ1NdW+nrauqyViY2NFUlKS114vUFgsFgFAFBQUNJxV4fCAx48//oji4mJMmjTJ7U1M7hccHIxx48Zh9+7dXn3dsrIyLF26FCaTCadOnUJERATMZnOTyyQkJKCyshJCCJhMJhiNRiQmJsJqtTYad+jQIQghIITAgQMHsGrVKqfrHThwINLT02EymewfRdetW4dZs2ZBCIF777233mMANBqNS1915efnY+zYsQgPD2/pfyryRY7a8p133hEhISHi/PnzHm1lcp/nn39e9O7d2yuvBQdbPaWlpY220BqOs22d1d3S27dvnwAgMjMz7dNsW3wN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c+fOYc6cOVi7di0fDO8F4eHAm28CAwbITkK+wqMXinbq1Ak7duzAggULMHv2bOh0Oly6dMmTL+kXiouLMXr0aHz44YfIycnB3LlzZUciUh2PXyUfEhKCF154AW+//TbeeOMNxMTE4Pjx455+WZ9lMBgQExOD3r174+DBg5g4caLsSESq5LVbhMyYMQMHDhxAhw4dMGrUKGzYsEFVD0L/5ptvcM899+CRRx7BypUrkZubi169esmORaRaXr0/Uv/+/VFQUICHH34YS5YswZgxY/DZZ595M4LXXb16FampqRg8eDC++OIL5ObmYtWqVbw1FZFkXv8X2K5dOzzzzDMoLi5G586dMWbMGCQlJcFisXg7isft3bsXI0aMwF/+8hckJyfj888/58dcIh8hbfNjyJAh2L17N/75z39ix44d+NWvfoU1a9YExKVxn332Ge6++25MnDgRffv2xeeff46UlBR07NhRdjQi+onUz14ajQYJCQk4evQodDodnn/+eURERECv1+PMmTMyo7VKQUEB7rjjDtxyyy04ffo0du7ciXfffRcDBw6UHU3VSkqAV1+VnYJ8jU/seAoLC8Pq1atx4sQJPP7448jIyED//v3x6KOP4sCBA7LjNenixYvIysrCxIkTMX78eFy6dAk5OTn45JNPoNVqZccjKLexeuop2SnI1/hE+dl069YNK1euxNdff42nnnoK77//PkaNGoWbb74Zzz77LE6dOiU7IgCgtrYWe/bswYIFC3Dddddh/vz5+MUvfoG9e/fiww8/xG9/+1vZEamO06eB666TnYJ8jU+Vn02nTp3w6KOP4siRI9i/fz8mTpyI559/Hn379sXkyZPx7LPP4tNPP0VNTY3XMv3www/YsWMHFi9ejP79+2PixIk4evQo1qxZg++++w47duzAuHHjvJaHXHfqFHD99bJTkK8JkR2gOaNHj8bo0aOxbt067Nq1C0ajEenp6Vi+fDlCQ0Mxfvx4TJo0CUOHDkVkZCQiIiLafH3sxYsXUVpaimPHjmH//v3YvXs3Dh48iJCQEIwZMwYLFy7ErFmzMGjQIDe9S/KkU6eA0aNlpyBf4/PlZ9OuXTtotVr7frQTJ04gPz8fu3fvxvPPP2+/g3THjh0RGRmJQYMGoW/fvujSpQs6d+6Mbt26ITQ0FF26dMHly5dRVVWFqqoqVFZWwmq14ty5czh+/DhKS0tRUVEBIQTatWuH4cOHY+rUqXj66acRGxuLTp06yfzPQK1QVQV06yY7Bfkavym/hvr164cFCxZgwYIFAACLxYJjx47h6NGj9q22PXv2oKqqCufPn0dlZSUsFguEEACAa665Bl26dLGXYteuXREZGYmpU6fipptuwqBBg9C/f3+0a9dO5tskN7hwAejSRXYK8jV+W34NhYWF4dZbb232mRfnz59Hhw4dEBISMG+dmnHlCsD/h1FDqmuAzp07y45AXpaYCIwdKzsF+RrVlR+pz6pVshOQL/LJU12IiDyN5UdEqsTyIyJVYvkRkSqx/IhIlVh+RKRKLD8KeM8+Cxw+LDsF+RqWHwW8VauA4mLZKeQzm83IyspCXFycW8Z5MoM38CRnCnidOgHnz8tOIV9KSgoMBoPbxrVGYmIijEajS2ONRiMyMjIAAAsXLnT7zYG55UcBLygIuHpVdgr50tLS3DquNbKzs10al5WVhYyMDGzatAmbNm3Cf/7zH3sRugu3/Cjgde3KLT9/UlFRgTlz5mDfvn0IDQ0FAOh0OgwfPhy33noroqKi3PI63PKjgHfttUAAPhm1TcxmM9atWweNRoOkpCRUVFQ0u4zVakVWVhY0Gg00Gg0yMjJgNptdGteU/Px8+1iNRoOPP/4YAHB9ndtvX/fTcwg+/fTTlrzNJrH8KOB17w6YTLJT+JaysjIsXboUJpMJp06dQkREhMMiqyshIQGVlZUQQsBkMsFoNCIxMbHR42YTEhJw6NAhCCEghMCBAwewqom7SwwcOBDp6ekwmUwQQmDPnj0AgL59+9rHhIeHA4DL+wtdIogCXHy8EHffLTtF28TGxoqkpKQ2rweAaPjPvrS0VAAQ6enpTsfl5eUJAMJkMtmn7du3TwAQmZmZ9mmZmZkOx2m1WofrLi4urre8s4xNTW+KxWIRAERBQUHDWRXc8qOA9/vfAz5wZoXPioyMBAAsWrTI6Zht27YB+HkLDAAGDx4MANi6dat9mu37uuOio6MdHugoLCyEwWBAfHx8G9K3HsuPAt7MmcADD8hO4d8cnfpiOxhR96NoSz6WnjhxAgaDAYWFhfWmN3VKi06nc3n9zWH5ERGApovFVkiO9gvWXc42rqSkpNnXi4+Ph16vR0xMTL31Onot2wGZkSNHNrteV7H8iFTOVlQTJkxwOmbu3LkAlAMlNrYDHbNmzbJPsxWXwWCwz6+oqEBSUpLD9SYnJ0Or1SIlJcU+7fbbb2/0WqdPn643zy1atPeQiKRw1wEPrVYrAIi8vDwhhBAmk0lotVqRmppqH2MymewHF2wHLiwWi9BqtUKr1dqnZWZmCp1OV2/9tvXZlgcgdDqdKC0tbbRui8UihBCivLy80QGX9PR0odPphMViERaLRWxqM60AACAASURBVOh0unrzXdXUAQ+WH5EfcFf5CaEcubUVlE6nsxehTd3iqrt9ZDKZRHp6un16ZmamvcDqMplMQq/XCwBCr9fbi8/Zum1Hkhu+XnZ2tgAgtFpto4yuaqr8ND8FIiIfNm7cOAwbNgwbNmyQHcWvWK1WhIWFoaCgALGxsXVnneQ+PyJSJZYfqcIHHwCpqbJTkC9h+ZEqHD4MPP207BTkS1h+pAq33AL8+CPw1Veyk5CvYPmRKowYAYSEAPv3y05CvoLlR6rQsSMQFQV88onsJOQrWH6kGrfcArjxdnDk51h+pBpjxgCffQZcuSI7CfkClh+pRmwsUF3Nj76kYPmRagwcCGzbBgwdKjsJ+QI+wIhUZeZM2QnIV3DLj4hUieVHRKrE8iMiVWL5EZEqsfyISJVYfqRaBw/KTkAysfxIlf77X2DkSOCLL2QnIVlYfqRKMTHAjTcCvCu8erH8SJWCgoAlS4B//Qs4e1Z2GpKB5Ueq9Yc/AJ07Ay++KDsJycDyI9Xq2BFYvBgwGICqKtlpyNtYfqRqDz0EnD8PvPKK7CTkbSw/UrXu3YE//Qn429+AixdlpyFvYvmR6i1bBuTmKh+DST1YfqR63bopDzgidWH5EZEqsfyISJVYfkSkSryNPZEfEELgzJkzKCoqkh3Fr1Q1cQIny4/IgcuXgfffB7Ra2UkUNTU12L59O7Zv3y47SsBg+RE5sHMnEB8P7NgBTJ8uOw0QEhKCefPm4cknn5Qdxa9UVlZi+PDhDuex/IgcuPdeIC8PSEhQbn81bJjsREC3bt0wYMAA2TH8itVqdTqPBzyInFi/Xjn/T6sFvv1WdhpyN5YfkRPt2wPbtytXfkyZApw5IzsRuRPLj6gJPXool75ducICDDQsP6Jm3HADsHu3cturzZtlpyF34QEPIhf07g18+qlyFxgKDNzyI3IRiy+wsPyIfMyVK8CRI8BbbwFPPqmcb3j69EzZsRqpqKhAUlISNBoNkpKSkJ+fLztSi7D8iHxAeTmwejVw221AaCgwZAgwezawaRNw6RIQEuJb99m3Wq0oKSlBWloaLBYLJkyYgClTpsBoNMqO5jKWH5Eb/Oc/wMaNgBCtW/7bb4H0dKBXL+WBSvv3K7fXP34ceOcdIDx8l3sDt9HevXuh/enav9DQUMTHxwMA4uLiZMZqER7wIHKDffuAp58GXn9deR7I0KFNjx87VtnK0+uBkBAgOho4edI7Wd1B6+SiZ51O5+UkrcctPyI3WL0a+OQT4MIFYPhw5alwJpMy7+xZ4Jlnfn5CXFkZ8PHHwF//Ctx8M/DZZ/Jyu4vtMrJp06ZJTuI6lh+Rm4weDRQWAi+/rFwZ0r+/ck1w795Aairw+efKuIIC5aHpgPKxdswYIDlZKU5/VVRUBK1Wi/Hjx8uO4jKWH5EbBQUpN0WYPRuorlaO2o4bp3yk/c1vlDF79wLBwcr3V68CtbXKfr6bblJupuCPXnjhBaxcuRKhoaGyo7iM5UfkJtXVwLp1wIABwJYtwEsvAT/+qGwFdur087i8POV0lrquXgVOn1b2Az7wgLKcv8jKyoJWq0V0dLTsKC3C8iNyk3PnlC24hx9W9us99BDQtaty6oqNyaSc1uJITY1ytHjrVmDgQGDbNu/kbouSkhIcOnQICxculB2lxVh+RG7SvTvw5ZfAmjVK6Tmydy+g0TS9nitXAItF+fis1QKnTrk/qzuYzWbk5uZi9erV9mklJSVISkqSmMp1LD8iN2rfvun5BQVAu3bNr6e2VvkzJ0c5YFJentj2cG5kNpuRmJiI5ORkaDQa+9fw4cP95ogvy4/Ii/LylH2DTQkKAjp0UIrUtm/w5Mn7cf687xxMSElJcXo1x6BBg7ycpnV4kjNRC1VXN7+F58iFC8Dhw8r3QUE/b90Byg1Te/UCrr9eOUXmuuuUW2ldf73y9dhjM9C58/XueQNukJaWhrS0NNkx2oTlR+QiIZQTk/fsUbbgglr4ualTJ2DBAuWUluuuUz7O9uoF9OkDdO7c9LLt238PwHfKLxCw/Ihc9H//p5zAbDC0vPhsXnvNvZmo9Vh+RC7Q64G0NOX0k5m+d3cpagWWH1EzUlN/vmkBiy9w8GgvURPS04HHHwdeeEG58oICB8uPyIlDhwCdDli1StnfR4GFH3uJnBg6VLlJ6e23y05CnsDyI2rCHXfITkCewvIj8gO1tbUoLCzE8uXLZUfxK5cvX3Y6j+VH5AeEEPjmm2+Qm5srO4pfqampcTqP5UfkB4KDgzFz5kxs2LBBdhS/YrVaERYW5nAej/YSkSqx/IgAVFQoz8ht7aMnyf+w/IgAPPqo8gS25m43RYGD+/xI9T78UHkw+HvvKffRI3Xglh+p3tq1wIQJPKdPbbjlR6pWVKTcKj4nR3YS8jZu+ZGqPfMMMGoU8Nvfyk5C3sYtP1KtI0eAHTv84xGR5H7c8iPV2r8fiIoCZsyQnYRkYPmRas2frxRga29JT/6NP3ZSteBg2QlIFpYfEakSy4+IVInlR0SqxPIjIlVi+RGRKrH8SFWysoBly2SnIF/AKzxIVTZvBtq1k52CfAG3/Eg1rlwB8vN59xZSsPxINYqKgIsXgUmTZCchX8DyI9XYswfo2ROIjJSdhHwBy49U4+OPgZgY2SnIV7D8SDWKi4ExY2SnIF/B8iNVsFqVJ7QNGyY7CfkKnupCqtC1K/Dll8o+PyKA5UcqERQE3Hij7BTkS/ixl4hUieVHRKrE8iMiVWL5EZEqsfyISJVYfkSkSiw/Cnj//Cdw/fWyU5CvYflRwPv2W6BjR9kpyNew/Cjgffstt/yoMZYfBbxTp4DrrpOdgnwNy48C3unTQPfuslOQr2H5UcA7f57lR42x/CjgVVUBnTrJTkG+huVHAa+mBujQQXYK8jW8pRUFvPJy5cltRHVxy49Ugc/qpYZYfkSkSiw/IlIllh8RqRLLj4hUieVHRKrE8iMiVWL5UcALCgK2bpWdQj6z2YysrCzExcW5ZZwnM3gDT3KmgBfC33IAQEpKCgwGg9vGtUZiYiKMRmOz46xWK44cOYIvvvgCRqMR2dnZbs/CLT8KeJ06KTc3ULu0tDS3jmsNV0ssNTUV7777LhYtWuRSWbYG/59IAU+jAa5elZ2CWmL16tUAgDVr1njsNbjlRwGvWzdu+TVkNpuxbt06aDQaJCUloaKiotllrFYrsrKyoNFooNFokJGRAbPZ7NK4puTn59vHajSaVr+nlmL5UcALDQXOnZOdwreUlZVh6dKlMJlMOHXqFCIiIhwWWV0JCQmorKyEEAImkwlGoxGJiYmwWq2Nxh06dAhCCAghcODAAaxatcrpegcOHIj09HSYTCYIIdzy/lzB8qOAFx4OfPed7BS+JTo6GgAQHh6O1NRUAMDOnTudjs/Pz4fRaMT06dPty61cuRJGoxHvvfeefVxWVhaMRiMWL15sn3b//fejpKTE4XpLSkrw8ccfY+HChQgPD2/z+2oJlh8FvF/+ErBYZKfwXZGRkQCARYsWOR2zbds2AKhXUIMHDwYAbK1zHpHt+7rjoqOjHR7oKCwshMFgQHx8fBvStx7LjwLepk3Am2/KTuHfHJ36EhoaCgD1jsa25MjsiRMnYDAYUFhY2PaArcDyo4DXvr3sBP5Bp9M5nafVagHA4X7BusvZxjn7mFtXfHw89Ho9YmJimt3f6AksPyKVsxXVhAkTnI6ZO3cuAOVAiY3tQMesWbPs02zlZzAY7PMrKiqQlJTkcL3JycnQarVISUlpwztoJUFEPi82NlYkJSW1eT1arVYAEHl5eUIIIUwmk9BqtSI1NdU+xmQyCQACgDCZTEIIISwWi9BqtUKr1dqnZWZmCp1OV2/9tvXZlgcgdDqdKC0tbbRui8UihBCivLxcABDp6en11mWxWBqNbSnbOgoKChrOqmD5EfkBd5WfEELk5eXZC0qn09mL0KZucdXdPjKZTCI9Pd0+PTMz02EpmUwmodfrBQCh1+vtxeds3Xl5eY2mNRzXMIurmio/zU8vREQ+bNy4cRg2bBg2bNggO4pfsVqtCAsLQ0FBAWJjY+vOOsl9fkSkSiw/UoXaWp7rR/Wx/EgVdDrg3ntlpyBfwvIjVRg4EPj8c9kpyJew/EgVRo4ETCZe40s/Y/mRKtxyi3Jfv08/lZ2EfAXLj1QhNBSIjAT275edhHwFy49U49ZbgU8+kZ2CfAXLj1TjlluAoiKAp/UTwPIjFfnNb4AbbgDOnpWdhHwBH2BEqjFqFE93oZ9xy4+IVInlR0SqxPIjIlVi+RGRKrH8iEiVWH5EpEosP1IloxH4859lpyCZWH6kShYLkJoKfP+97CQkC8uPVOmee4CQEOAf/5CdhGRh+ZEqde4M/OEPwPr1wNWrstOQDCw/Uq3HHgNOnwa2bZOdhGRg+ZFq9eunfPx97jnZSUgGlh+p2rJlwMGDwK5dspOQt7H8SNVGjgTuugsoK5OdhLyNt7Qi1cvOVp7vQerCLT9SPRafOrH8iEiVWH5EpEosPyJSJR7wIPIDNTU12LJlC3JycmRH8Su1tbVO57H8iBq4fBlYvhyYPx8YMUJ2GoVGo8GQIUMwY8YM2VH8yqVLl/DEE084nMfyI2ogJEQ58Tk7GygsBHr0kJ0ICAoKQlRUFJYtWyY7il+xWq1Oy4/7/IgaCA5WrvetqQHi45U/KfCw/Igc6NEDeOcdZcvvscdkpyFPYPkROTF8OPD668BLLwFr18pOQ+7GfX5ETZg9GzCbgf/7P+Caa4AlS2QnIndh+RE1Y/FioLoa2L9fdhJyJ5YfkQuWLgWEkJ2C3In7/IhcxBsg1Gc2m7Fq1SpoNBpoNBpkZWXJjtQiLD8iH3f5MnD1aqjsGPWYzWaUlZVh9erVEEIgMzMTc+bMwbp162RHcxnLj8iHfPMNsHWrcoXJ9OnAr36lPGzpxImFsqPVU1ZWhujoaPvf4+PjAQDJycmyIrUYy4+ojb74Ali9um1PgfvoI2DAAKBPH+Wyul27lNJ74AHgjTeA3r23uC2vO9QtPkC5kgIA9Hq9jDitwgMeRG30xRfAmjXA228Df/87cOutzS9jMgGhocrpMwAQEaGU3rhxQHS0Unx1vfDCtwC6uz27O1RUVCAjIwMAkJCQIDmN67jlR9RGc+cCxcXAL34BxMQAf/wj8MMP9cfUvbnI1atAr15Ax47A3r3KtD59gCeeAKZMaVx8vqyiogIRERFYs2YNAMBoNEpO5DqWH5EbDB4M5OUB//oXYDQqj8V86imgvFy5OqR/f+DwYWVsUZHyp0YDTJwIJCUB587JSt42ffv2hRACxcXF0Ov1SE5Otm8F+jqWH5GbaDTAffcpJffQQ8p+wBtvBJ59Fpg5EwgLU8bt3Qu0a6ecNygE8NprQGQk8O67cvO3RVRUlP0j76JFiySncQ3Lj8iNqquVMnv1VaBLF+Dxx4GTJ4F164Drr1fG7N5d/04xV64AZ84oj9CcM0f53h9FRkbKjtAiLD8iN6moAAYNAlatAhYtAr78Enj6aaUEbWprlSO7DW8wbPv7W28pW4GbN3svt7vYjvhmZmZKTuIalh+Rm/Tpo5Te0aNK6dk+5tb1v/8BlZXO13HlCmC1Kkd+b79dKVRfFBcXh3Xr1qHip4BWqxWpqanQ6/X2c/58HU91IXITjQZYsaLpMXv2KHeKbuqcQNs1xLt3AzfdBDz3HOBr2ykLFy5EXFyc/aTm1NRU3HnnnY3O//NlLD8iL9qzx/UbJFy5onw98ggA7MHgwb5zPy2tVgvh53d6YPkRedFbbzWeFhSkbA0CyhZh3f2B7dsrB1GCgqpRW+tbW3/+juVH1AKnTwNHjignI7fUhQs/f9+hA9CzJ3Dddco5gL16KUeDe/UCbrjh57/b9huOGzcF7dsPc8+bIAAsPyKXHToE3HGHUkqFhS2/xVWnTsBXXynPB+na1TMZyXUsPyIXHDsGTJqkXLmxa1fr7+03YIBbY1EbsPyImnHihPIxd8AA4IMPuNUWKLgHlagJp08Dt90GXHutssXH4gscLD8iJ6qqlBONg4OB3FzHJy2T/2L5ETlRUaGcarJrl3KQggIL9/kROTFkyM+3n5JNCIEzZ86gyFcC+Ymqqiqn81h+RH6gpqYG27dvx/bt22VHCRgsPyI/EBISgnnz5uHJJ5+UHcWvVFZWYvjw4Q7nsfyI/ES3bt0wgCcKtojtNluO8IAHEakSy48Iyp2VG95glAIby48IwAsvAOPHswDVhOVHqnfqFJCcDEydqtxeitSBP2pSveefV05iXrZMdhLyJpYfqdrZs0B6OrB8ufIQcVIPlh+p2osvAtdcozx4iNSF5UeqZbUCL78MPPpo/cdLkjqw/Ei1NmxQHiakPCCI1IZXeJBqTZ+uPGSct6pSJ5YfqdaQIcoXqRM/9hKRKrH8iEiVWH5EpEosPyJSJZYfEakSy49UpaIC+OEH2SnIF7D8SFVWrABmzZKdgnwBy49UQwggJ0d5CDkRy49U48gR4PvvgSlTZCchX8DyI9XYswfo2hUYOVJ2EvIFLD9SjY8+AsaMAYKDZSchX8DyI9U4cEApPyKA5UcqcfEicPw44OT51aRCLD9ShcpK4J57uL+PfsZbWpEqhIcDb74pOwX5Em75EZEqsfyISJVYfkSkSiw/IlIllh8RqRLLj4hUieVHAa+kBHj1VdkpyNew/Cjg5eQATz0lOwX5GpYfBbzTp4HrrpOdgnwNy48C3qlTwPXXy05BvoblRwGP5UeOsPwo4FVVAd26yU5BvoblRwHvwgWgSxfZKcjXsPwo4F25ArRrJzsF+RqWHwW8xERg7FjZKcjX8H5+FPBWrZKdgHwRt/yISJVYfkSkSiw/IlIllh8RqRLLj4hUieVHpBJmsxlZWVmIi4tzyzhPZvAGlh8FvGefBQ4flp1CvpSUFMyZMwdGo9Et41ojMTHRpXVXVFQgKSkJGo0GSUlJyM/Pd3sWlh8FvFWrgOJi2SnkS0tLc+u41sjOzm52jNVqRUlJCdLS0mCxWDBhwgRMmTLF7WXM8qOA16kTcP687BTkqr1790Kr1QIAQkNDER8fDwBu/6jM8qOAFxQEXL0qO4VvMZvNWLdunf1jZUVFRbPLWK1WZGVlQaPRQKPRICMjA2az2aVxTcnPz7eP1Wg09uJrSKfTufbmXMTyo4DXtSu3/BoqKyvD0qVLYTKZcOrUKURERDgssroSEhJQWVkJIQRMJhOMRiMSExNhtVobjTt06BCEEBBC4MCBA1jVxDWGAwcORHp6OkwmE4QQjebb1j9t2rRWvFPnWH4U8K69FrBYZKfwLdHR0QCA8PBwpKamAgB27tzpdHx+fj6MRiOmT59uX27lypUwGo1477337OOysrJgNBqxePFi+7T7778fJSUlDtdbUlKCjz/+GAsXLkR4eLjDMUVFRdBqtRg/fnzL3mQzWH4U8Lp3B0wm2Sl8V2RkJABg0aJFTsds27YNAOoV1ODBgwEAW7dutU+zfV93XHR0tMMDHYWFhTAYDPZ9es688MILWLlyJUJDQ5t7Ky3C8qOA17078P33slP4N4PB0GiarYzqHoVtyRHZEydOwGAwoLCw0OmYrKwsaLVa+5aqO7H8KOD9/veAD5xT6/OaOqBgOwjhaL9g3eVs45x9zK0rPj4eer0eMTExDtdbUlKCQ4cOYeHChc2uqzVYfhTwZs4EHnhAdgrfZSuqCRMmOB0zd+5cAMqBEhvbgYhZs2bZp9nKz2Aw2OfbTlh2JDk5GVqtFikpKfWmm81m5ObmYvXq1fVyOltPqwgi8nmxsbEiKSmpzevRarUCgMjLyxNCCGEymYRWqxWpqan2MSaTSQAQAITJZBJCCGGxWIRWqxVardY+LTMzU+h0unrrt63PtjwAodPpRGlpaaN1WywWIYQQ5eXlAoBIT093ug7bV3Z2dover8ViEQBEQUFBw1kVLD8iP+Cu8hNCiLy8PHu56HQ6exHaNCwcG5PJJNLT0+3TMzMz7QVWl8lkEnq9XgAQer3eXnzO1p2Xl9eoLB0VH4B663JFU+Wn+SkQEfmwcePGYdiwYdiwYYPsKH7FarUiLCwMBQUFiI2NrTvrJPf5EZEqsfyISJVYfkSkSiw/UoUPPgB+uoqLCADLj1Ti8GHg6adlpyBfwvIjVbjlFuDHH4GvvpKdhHwFy49UYcQIICQE2L9fdhLyFSw/UoWOHYGoKOCTT2QnIV/B8iPVuOUW4NNPZacgX8HyI9UYMwb47DPgyhXZScgXsPxINWJjgepqfvQlBcuPVGPgQGDbNmDoUNlJyBeEyA5A5E0zZ8pOQL6CW35EpEosPyJSJZYfEakSy4+IVInlR0SqxPIj1Tp4UHYCkonlR6r03/8CI0cCX3whOwnJwvIjVYqJAW68EeDzgNSL5UeqFBQELFkC/OtfwNmzstOQDCw/Uq0//AHo3Bl48UXZSUgGlh+pVseOwOLFgMEAVFXJTkPexvIjVXvoIeD8eeCVV2QnIW9j+ZGqde8O/OlPwN/+Bly8KDsNeRPLj1Rv2TIgN1f5GEzqwfIj1evWTXnAEakLy4+IVInlR0SqxDs5E/mB2tpaFBYWYvny5bKj+JXLly87ncfyI/IDQgh88803yM3NlR3Fr9TU1Didx/IjcuDyZeD99wGtVnYSRXBwMGbOnIkNvBi5RaxWK8LCwhzO4z4/Igd27gSmT1f+pMDE8iNy4N57gYULgYQE3vYqULH8iJxYv145/0+rBb79VnYacjeWH5ET7dsD27crV35MmQKcOSM7EbkTy4+oCT16KJe+XbnCAgw0LD+iZtxwA7B7t3Lbq82bZafxbatWrcKqVasAAGazGVlZWYiLi5OcyjGe6kLkgt69gU8/Ve4CQ65JSUmBwWCQHcMplh+Ri1h8zVu9erX9+7S0NJ8uP37sJSJVYvkRUbMa7r8zGo3QaDSIi4tDRUWFwzG+jh97idzgP/9RngKXkABoNLLTuF9iYiKMRiMAoLCwEFqtFuXl5YiIiMANN9yAtLS0emP8Abf8iNxg3z7gwQeBSZOAQ4eaHz92LPDEE8DVqx6P5hbZ2dn276OjowEAffv2BQD7fr26Y/wBy4/IDVavBj75BLhwARg+XHkqnMnkeGxZGfDxx8Bf/wrcfDPw2WfezUoKlh+Rm4weDRQWAi+/rFwZMmAA8NhjjUuwoEB5aDoAHD8OjBkDJCcrxUnew/IjcqOgIOCPf1S27p5+GsjMVJ4MV9fevUBwsPL91atAba3y4PSbbgLy8ryfWa1YfkQe0LEj8OijSgn+5S/15+XlKZfL1XX1KnD6NHDbbcADDwA//ui1qKrF8iPyoI4dgdDQn/9uMgHl5Y7H1tQAQgBbtwIDBwLbtnknoyvMZrP9e6vVWu9P2/y6Yxz93dew/Ii8aO/e5k+FuXIFsFiUewpqtcCpU97J1pSePXvav7fdGbnuHZJ79uxZb4yjv/salh+RFxUUAO3aNT+utlb5MydHua64vDzRs8GaIYSo9+VoWnNfvoblR+RFeXlAdXXTY4KCgA4dlPsJ2vYNnjx5P86fD216QWoRXuFB5CUXLgCHDyvfBwX9vHUHKPsGe/UCrr8e6N8fuO465VZa11+vfD322Ax07ny9nOABiuVH5CWdOgELFiintFx3nfJxtlcvoE8foHPnppdt3/57ACw/d2L5EXnRa6/JTkA23OdHRKrE8iMiVWL5EZEqsfyISJVYfkSkSjzaS+QHampqsGXLFuTk5MiO4ldq655M2QDLj8gPaDQaDBkyBDNmzJAdxa9cunQJTzzxhMN5LD8iPxAUFISoqCgsW7ZMdhS/YrVanZYf9/kRkSqx/IhIlVh+RKRKLD8iUiWWHxGpEsuPiFSJ5UdEqsTyIyJVYvkRkSqx/IhIlVh+RKRKLD8iUiWWHxGpEsuPiFSJ5UdEqsTyIyJVYvkRkSqx/IhIlVh+RKRKLD8iUiWWHxGpEsuPiFSJ5UdEqsTyIyJVYvkRkSqx/IhIlVh+RKRKLD8iUiWWHxGpEsuPiFSJ5UdEqsTyIyJVYvkRkSqx/IhIlVh+RKRKLD8iUiWWHxGpEsuPiFSJ5UdEqsTyIyJVYvkRkSqx/IhIlVh+RKRKLD8iUiWWHxGpEsuPiFSJ5UdEqsTyIyJVYvkRqYTZbEZWVhbi4uLcMs6TGbwhRHYAIvKOlJQUGAwGt41rjcTERBiNxmbHmc1mrF+/HmvWrAEAZGZmIj4+3q1ZuOVHpBJpaWluHdca2dnZzY4xm80oKyvD6tWrIYRAZmYm5syZg3Xr1rk1C8uPiHxKWVkZoqOj7X+3bfElJye79XVYfkQqZDabsW7dOmg0GiQlJaGioqLZZaxWK7KysqDRaKDRaJCRkQGz2ezSuKbk5+fbx2o0mnrFZ1sfAOj1+ha8w+ax/IhUqKysDEuXLoXJZMKpU6cQERHhsMjqSkhIQGVlJYQQMJlMMBqNSExMtJdT3XGHDh2CEAJCCBw4cACrVq1yut6BAwciPT0dJpMJQoh68yoqKpCammpfr1sJIvJ5sbGxIikpqc3rASAa/rMvLS0VAER6errTcXl5eQKAMJlM9mn79u0TAERmZqZ9WmZmpsNxWq3W4bqLi4vrLV9XeXm5fSwAkZqa2uL3a7FYBABRUFDQcFYFt/yIVC4yMhIAsGjRIqdjtm3bBgAIDw+3Txs8eDAAYOvWrfZptu/rjouOjnZ4oKOwsBAGg8HpUdy+fftCCIHi4mLo9XokJyc3+xG6JVh+RNQsR6e+hIaGAkC9U1dcOY3F5sSJEzAYDCgsLGxyXFRUlP0jb1MF3VIsPyICAOh0OqfztFotADjcL1h3Odu4kpKSZl8vPj4eer0eMTExze5vtG2duhPLj0jlbEU1YcIEp2Pmzp0LQDlQYmM70DFr1iz7NFv5GQwG+/yKigokJSU5XG9ycjK0Wi1SUlKazGhbV2ZmFdzuBAAAAddJREFUZpPjWqTFexCJyOvcdcBDq9UKACIvL08IIYTJZBJarbbewQSTyWQ/yGA7cGGxWIRWqxVardY+LTMzU+h0unrrt60PdQ5U6HQ6UVpa2mjdFotFCPHzgQ3bARdbnvLycvtr6/V6odfrW/x+mzrgwfIj8gPuKj8hlCO3toLS6XT2IrSpW1x1t49MJpNIT0+3T8/MzLQXWF0mk0no9XoBQOj1envxOVu37Uiy7Ss7O7vRUd59+/a16r02VX6anwIRkQ8bN24chg0bhg0bNsiO4lesVivCwsJQUFCA2NjYurNOcp8fEakSy4+IVInlR0SqxPIjIlVi+RGRKrH8iEiVWH5EpEosPyJSJZYfEakSy4+IVInlR0SqxPIjIlVi+RGRKrH8iEiVWH5EpEosPyJSJZYfEakSy4+IVInlR0SqxPIjIlVi+RGRKrH8iEiVWH5EpEosPyJSJZYfEakSy4+IVInlR0SqxPIjIlVi+RGRKoXIDkBEzaupqUFRURGKiopkR/ErVqvV6TyWH5Ef6N69O4xGI0aPHi07il+69tprG03TCCGEhCxE1AIXLlzAd999JzuGX2rfvj169+7dcPJJlh8RqdFJHvAgIlVi+RGRKrH8iEiV/j+7v0/QVueimwAAAABJRU5ErkJggg==" alt="" />
初始化函数如下:
bool Chunk::Init( std::size_t blockSize, unsigned char blocks )
{
const std::size_t allocSize = blockSize * blocks;
Data_ = static_cast< unsigned char * >( ::std::malloc( allocSize ) );
Reset( blockSize, blocks );
return true;
}
比较重要的函数在Reset里面,它的主要功能是将chunk连续的内存划分为一个个固定大小的节点,通过下标指针的方式链接成链表,下标指针存储在每个节点内存的起始处,chunk有下面三个成员变量:
/// Pointer to array of allocated blocks.
unsigned char * pData_;
/// Index of first empty block.
unsigned char firstAvailableBlock_;
/// Count of empty blocks.
unsigned char blocksAvailable_;
//将pData_内存链接成链表
void Chunk::Reset(std::size_t blockSize, unsigned char blocks)
{
firstAvailableBlock_ = 0;
blocksAvailable_ = blocks;
unsigned char i = 0;
//链表链接起来
for ( unsigned char * p = pData_; i != blocks; p += blockSize )
{
*p = ++i;
}
}
上层调用chunk的分配内存函数Allocate的时候传递的大小是与init的参数blocksize是一致的,下面的函数allocate就是分配链表的头节点,并将当前链表长度减1
void* Chunk::Allocate(std::size_t blockSize)
{
if ( IsFilled() ) return NULL; assert((firstAvailableBlock_ * blockSize) / blockSize ==
firstAvailableBlock_);
unsigned char * pResult = pData_ + (firstAvailableBlock_ * blockSize);
firstAvailableBlock_ = *pResult;
--blocksAvailable_; return pResult;
}
FixedAllocator
FixedAllocator,顾名思义每次调用它分配的内存大小是确定的,分配的大小在初始化的时候确定,底层维护则一个chunk vector以及三个重要的指针,这三个指针或者为NULL或者指向chunks_中的元素,主要的目的是提高内存分配的效率:
typedef std::vector< Chunk > Chunks;
/// Container of Chunks.
Chunks chunks_;
/// Pointer to Chunk used for last or next allocation.
Chunk * allocChunk_; //用于分配
/// Pointer to Chunk used for last or next deallocation.
Chunk * deallocChunk_;//用于回收
/// Pointer to the only empty Chunk if there is one, else NULL.
Chunk * emptyChunk_;//指向一个内存都在自己手里的chunk
这里需要注意这三个指针的含义:
emptyChunk_
主要起到一个缓冲或者中介的作用,它指向的chunk是chunks_中唯一一个空的chunk(内存未分配出去,全部在手上),chunks_里面只能用一个空chunk,如果没用空的chunk那么emptyChunk_为NULL。emptyChunk重要其的是一个缓冲的作用,当allocChunk指向的chunk分配完之后那么久将emptyChunk给allocChunk用,如果deallocChunk_指向chunk把分配出去的内存都回收回来变为一个空chunk之后,如果
allocChunk_
指向chunks_中的元素,主要用于分配内存,如果为NULL或者指向的chunk已经分配完(掌管的内存都给别人用了),那么就将emptyChunk_指向的chunk给allocChunk_用,如果emptyChunk为NULL说明chunks_里面没有一个空的chunk(这里空chunk指的是未分配过内存到外面或者内存已经全部回收回来的chunk,即自己通过pData_掌管的内存都在自己手里),那么就会新建一个然后添加到chunks_中,并且将allocChunk_指向新添加的
deallocChunk_
指向chunk_中的元素,主要用于回收内存,当指向的chunk回收全部已经分配出去的内存之后就将这个chunk交给emptyChunk_管理,然后指向新的chunk
分配与回收过程代码分析
可以看出其实emptyChunk_起到桥梁的作用,它要保证chunks_中有且只有一个空的chunk,这样可以节约内存的使用,同时又能快速的分配,下面看一下FixedAllocator分配与回收内存代码.
/***********************************************************************
* 分配内存 *
***********************************************************************/
void * FixedAllocator::Allocate( void )
{
if ( ( NULL == allocChunk_ ) || allocChunk_->IsFilled() ) //如果allocChunk_不可用的话
{
if ( NULL != emptyChunk_ )
{
allocChunk_ = emptyChunk_; //将emptyChunk_保存的emptyChunk_交给allocChunk_
emptyChunk_ = NULL;
}
else
{
// 在chunks_中找到一个合适的chunk给allocChunk否则就新建一个chunk并push到chunks中
for ( ChunkIter i( chunks_.begin() ); ; ++i )
{
if ( chunks_.end() == i )
{
if ( !MakeNewChunk() )
return NULL;
break;
}
if ( !i->IsFilled() )
{
allocChunk_ = &*i;
break;
}
}
}
}
else if ( allocChunk_ == emptyChunk_)
// detach emptyChunk_ from allocChunk_, because after
// calling allocChunk_->Allocate(blockSize_); the chunk
// is no longer empty.
emptyChunk_ = NULL; assert( allocChunk_ != NULL );
assert( !allocChunk_->IsFilled() );
//通过
void * place = allocChunk_->Allocate( blockSize_ );
// prove either emptyChunk_ points nowhere, or points to a truly empty Chunk.
assert( ( NULL == emptyChunk_ ) || ( emptyChunk_->HasAvailable( numBlocks_ ) ) );
assert( CountEmptyChunks() < 2 );
return place;
} /***********************************************************************
* 回收内存 *
***********************************************************************/
bool FixedAllocator::Deallocate( void * p, Chunk * hint )
{
// VicinityFind的作用是从chunks中找到p所属的chunk,可以简单的遍历所用的chunks元素,但是loki库中考虑到效率,用了比较特殊的查找方法,看后面代码
Chunk * foundChunk = ( NULL == hint ) ? VicinityFind( p ) : hint;
if ( NULL == foundChunk )
return false;
assert( foundChunk->HasBlock( p, numBlocks_ * blockSize_ ) );
deallocChunk_ = foundChunk;
DoDeallocate(p);
assert( CountEmptyChunks() < 2 ); //确保chunks中不会多余一个空的chunk
return true;
} void FixedAllocator::DoDeallocate(void* p)
{
// call into the chunk, will adjust the inner list but won't release memory
deallocChunk_->Deallocate(p, blockSize_);
if ( deallocChunk_->HasAvailable( numBlocks_ ) ) // 判断deallocChunk指向的chunk是否已经回收完自己分配出去的内存,如果是就将这个chunk交给emptyChunk管理
{
if ( NULL != emptyChunk_ )//如果emptyChunk已经指向一个空的chunk的话,需要将这个chunk释放掉
{
// If last Chunk is empty, just change what deallocChunk_
// points to, and release the last. Otherwise, swap an empty
// Chunk with the last, and then release it.
// 这里为了效率,将vector的最后一个元素与emptyChunk交换,然后pop_back ,而不是直接erase
Chunk * lastChunk = &chunks_.back();
if ( lastChunk == deallocChunk_ ) //最后一个元素,直接指向emptyChunk就可以
deallocChunk_ = emptyChunk_;
else if ( lastChunk != emptyChunk_ )
std::swap( *emptyChunk_, *lastChunk );
assert( lastChunk->HasAvailable( numBlocks_ ) );
lastChunk->Release();
chunks_.pop_back();
//防止该release的chunk是allocChunk
if ( ( allocChunk_ == lastChunk ) || allocChunk_->IsFilled() )
allocChunk_ = deallocChunk_;
}
emptyChunk_ = deallocChunk_;
}
// prove either emptyChunk_ points nowhere, or points to a truly empty Chunk.
assert( ( NULL == emptyChunk_ ) || ( emptyChunk_->HasAvailable( numBlocks_ ) ) );
}
最后剩下一个问题就是,在dealloc的时候如何知道释放的内存所在的chunk,在dealloc函数中的第一行代码可以看出算法在VicintyFind中实现,大致思想是用deallocChunk指向的位置向两端查找,通过Chunk::HasBlock判断p指向的内存是否属于某个Chunk
Chunk * FixedAllocator::VicinityFind( void * p ) const
{
if ( chunks_.empty() ) return NULL;
const std::size_t chunkLength = numBlocks_ * blockSize_;
Chunk * lo = deallocChunk_;
Chunk * hi = deallocChunk_ + 1;
const Chunk * loBound = &chunks_.front();
const Chunk * hiBound = &chunks_.back() + 1;
// Special case: deallocChunk_ is the last in the array
if (hi == hiBound) hi = NULL;
{
if (lo)
{
if ( lo->HasBlock( p, chunkLength ) ) return lo;
if ( lo == loBound )
{
lo = NULL;
if ( NULL == hi ) break;
}
else --lo;
}
if (hi)
{
if ( hi->HasBlock( p, chunkLength ) ) return hi;
if ( ++hi == hiBound )
{
hi = NULL;
if ( NULL == lo ) break;
}
}
}
return NULL;
}
SmallObjAllocator
SmallObjAllocator维护一个固定长度的FixedAllocator数组,初始化的时候确定,SmallObjAllocator维护着三个成员变量:
/// Pointer to array of fixed-size allocators.
Loki::FixedAllocator * pool_; /// Largest object size supported by allocators.
const std::size_t maxSmallObjectSize_; /// Size of alignment boundaries.
const std::size_t objectAlignSize_;
通过构造函数能够了解数据结构的含义:
// SmallObjAllocator::SmallObjAllocator ---------------------------------------
//底层由多个([maxobjectSize/objectAlignSize]个)pool组成,每个pool内存大小最大为pagesize,
//pool的一块内存由numBlock个blockSize组成,其中blocksize=(i+1)*alignSize, numBlock=pagesize/blockSize
//numBlock <= UCHAR_MAX,不同下标的pool分配的block不一样,下标i的pool分配的block大小为(i+1)*alignSize
SmallObjAllocator::SmallObjAllocator( std::size_t pageSize,
std::size_t maxObjectSize, std::size_t objectAlignSize ) :
pool_( NULL ),
maxSmallObjectSize_( maxObjectSize ),
objectAlignSize_( objectAlignSize )
{
assert( 0 != objectAlignSize );
const std::size_t allocCount = GetOffset( maxObjectSize, objectAlignSize );//GetOffset向上取整( numBytes + alignExtra ) / alignment 其中numBytes=maxObjectSize, alignExtra = objectAlignSize -1
pool_ = new FixedAllocator[ allocCount ];
for ( std::size_t i = 0; i < allocCount; ++i )
pool_[ i ].Initialize( ( i+1 ) * objectAlignSize, pageSize );
}
SmallObjAllocator中的维护的pool不同下标的FixedAllocator分配的内存大小不同,下标约大分配的内存越大,pagesize指定最底层的连续内存chunk的大小,通过SmallObjAllocator分配内存的时候,如果需要的内存大小超过了maxObjectSize则自动调用malloc或者new进行分配,如果小于maxObjectSize则通过计算从pool_中得到一个合适的FiexObjAllocator,它分配的内存大小刚好大于或者等于所需的内存大小:
void * SmallObjAllocator::Allocate( std::size_t numBytes, bool doThrow )
{
//超过MaxObjSize,调用C语言的malloc或者C++的new
if ( numBytes > GetMaxObjectSize() )
return DefaultAllocator( numBytes, doThrow );
if ( 0 == numBytes ) numBytes = 1;
const std::size_t index = GetOffset( numBytes, GetAlignment() ) - 1; // 得到对应pool中的小标,对应的FiexAllocator固定分配的内存大小刚好满足numBytes
const std::size_t allocCount = GetOffset( GetMaxObjectSize(), GetAlignment() );
(void) allocCount;
assert( index < allocCount ); FixedAllocator & allocator = pool_[ index ];
assert( allocator.BlockSize() >= numBytes );
assert( allocator.BlockSize() < numBytes + GetAlignment() );
void * place = allocator.Allocate(); //内存不足的情况出现,因为底层的chunk可能有空的chunk,所以调用TrimExcessMemory,尝试释放pool中每个FixedAllocator下chunks可能存在的emptyChunk,尽可能的把用户态内存先归还给操作系统,然后在分配给用户态
if ( ( NULL == place ) && TrimExcessMemory() )
place = allocator.Allocate(); if ( ( NULL == place ) && doThrow ) //如果还不行的话,没救了,看看要不要抛出异常,否则返回NULL
{
#ifdef _MSC_VER
throw std::bad_alloc( "could not allocate small object" );
#else
// GCC did not like a literal string passed to std::bad_alloc.
// so just throw the default-constructed exception.
throw std::bad_alloc();
#endif
}
return place;
}
上面的TrimExcessMemory不做分析,感兴趣可以自己看源代码.释放内存的时候比较麻烦,因为你不知道释放的内存多大,如果知道释放的内存大小,那么久能很快的找到对应的FixedAllocator在pool的位置,但是我们通过C语言的free和C++ 的delete是不需要传入大小的,因此需要通过特殊的算法查找释放的内存所属的FixedAllocator.
Loki的做法比较简单,直接遍历所有的pool中的FixedAllocator,查看该块内存是否属于自己的chunk,如果是就进行释放
void SmallObjAllocator::Deallocate( void * p )
{
if ( NULL == p ) return;
assert( NULL != pool_ );
FixedAllocator * pAllocator = NULL;
const std::size_t allocCount = GetOffset( GetMaxObjectSize(), GetAlignment() );
Chunk * chunk = NULL;
for ( std::size_t ii = 0; ii < allocCount; ++ii )
{
chunk = pool_[ ii ].HasBlock( p ); //遍历pool,查看该块内存是否属于对应的FixedAllocator
if ( NULL != chunk )
{
pAllocator = &pool_[ ii ];
break;
}
}
if ( NULL == pAllocator )
{
DefaultDeallocator( p );
return;
}
assert( NULL != chunk );
const bool found = pAllocator->Deallocate( p, chunk );
(void) found;
assert( found );
}
smallObject
上面的文字仅仅是分析SmallObj中内存的分配、回收过程以及内部的数据结构,前面说过loki库是基于策略的,也就是说通过实现一个模板框架,通过传入算法策略(这里是通过模板参数)我们能够改变框架内部的过程,通过不同策略的组合我们能够实现无数的功能.SmallObj还有两个外包类:
AllocatorSingleton
它继承自SmallObjAllocator,AllocatorSingleton有多个模板参数,主要的策略算法有用于管理自己单件模式的生命期策略,线程同步策略,类原型:
template
<
template <class, class> class ThreadingModel = LOKI_DEFAULT_THREADING_NO_OBJ_LEVEL,
std::size_t chunkSize = LOKI_DEFAULT_CHUNK_SIZE,
std::size_t maxSmallObjectSize = LOKI_MAX_SMALL_OBJECT_SIZE,
std::size_t objectAlignSize = LOKI_DEFAULT_OBJECT_ALIGNMENT,
template <class> class LifetimePolicy = LOKI_DEFAULT_SMALLOBJ_LIFETIME,
class MutexPolicy = LOKI_DEFAULT_MUTEX
>
class AllocatorSingleton : public SmallObjAllocator
{
// ...
// 单件模式
inline static AllocatorSingleton & Instance( void )
{
return MyAllocatorSingleton::Instance();
}
}
SmallObjectBase
该类提供线程锁操作,重载了new与delete,属于应用层提供给用户使用,内存的申请与释放都是通过单例AllocatorSingleton.allocate来操作
template
<
template <class, class> class ThreadingModel,
std::size_t chunkSize,
std::size_t maxSmallObjectSize,
std::size_t objectAlignSize,
template <class> class LifetimePolicy,
class MutexPolicy
>
class SmallObjectBase{
//....
typedef AllocatorSingleton< ThreadingModel, chunkSize,
maxSmallObjectSize, objectAlignSize, LifetimePolicy > ObjAllocatorSingleton;
typedef typename ObjAllocatorSingleton::MyAllocatorSingleton MyAllocatorSingleton;
// 重载new操作符
static void * operator new ( std::size_t size ) throw ( std::bad_alloc )
{
typename MyThreadingModel::Lock lock;
(void)lock; // get rid of warning
return MyAllocatorSingleton::Instance().Allocate( size, true );
}
//....
}
实际使用的SmallObject仅仅是继承自SmallObjectBase
结束语
至此分析Loki.SmallObj源代码暂时结束,最后发现完完整整的写下自己的思考与分析过程是比较重要的,但是要写清楚写明白,能让自己以后看懂,让别人看懂更难。写完下来发现自己的写作水平有待提高,因为一直没有写作的习惯,分析代码都是在源代码中写注释和笔记,后来发现这样的学习方式不太好,因为一些重要的要点不可能说以后忘记了再去打开source insight从一堆代码里面查找,这样的效率太低,不利于记忆与学习。通过写blog的方式可以将自己的思路与想法表达出来,利于记忆,以后能够回过头来复习,同时还能锻炼自己写作与表达能力,分享知识。还是一句话:坚持。
原文 http://www.cnblogs.com/UnGeek/p/4537114.html
loki之内存池SmallObj[原创]的更多相关文章
- 定长内存池之BOOST::pool
内存池可有效降低动态申请内存的次数,减少与内核态的交互,提升系统性能,减少内存碎片,增加内存空间使用率,避免内存泄漏的可能性,这么多的优点,没有理由不在系统中使用该技术. 内存池分类: 1. ...
- 不定长内存池之apr_pool
内存池可有效降低动态申请内存的次数,减少与内核态的交互,提升系统性能,减少内存碎片,增加内存空间使用率,避免内存泄漏的可能性,这么多的优点,没有理由不在系统中使用该技术. 内存池分类: 1. ...
- linux内存源码分析 - 内存池
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 内存池是用于预先申请一些内存用于备用,当系统内存不足无法从伙伴系统和slab中获取内存时,会从内存池中获取预留的 ...
- 常见C++内存池技术
原文:http://www.cppblog.com/weiym/archive/2013/04/08/199238.html 总结下常见的C++内存池,以备以后查询.应该说没有一个内存池适合所有的情况 ...
- LevelDB学习笔记 (3): 长文解析memtable、跳表和内存池Arena
LevelDB学习笔记 (3): 长文解析memtable.跳表和内存池Arena 1. MemTable的基本信息 我们前面说过leveldb的所有数据都会先写入memtable中,在leveldb ...
- 基于C/S架构的3D对战网络游戏C++框架_05搭建系统开发环境与Boost智能指针、内存池初步了解
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- berkeley db 内存池分配机制
__memp_alloc() 注: MPOOL_ALLOC_SEARCH_DYN 没有 出现在 bdb document上, 也没出现在 除了mp_alloc外的代码里. 先删了 以便代码清楚. 按 ...
- NGINX 内存池有感
写在前面 写NGINX系列的随笔,一来总结学到的东西,二来记录下疑惑的地方,在接下来的学习过程中去解决疑惑. 也希望同样对NGINX感兴趣的朋友能够解答我的疑惑,或者共同探讨研究. 整个NGINX系列 ...
- 【uTenux实验】内存池管理(固定内存池和可变内存池)
1.固定内存池管理实验 内存管理是操作系统的一个基础功能.uTenux的内存池管理函数提供了基于软件的内存池管理和内存块分配管理.uTenux的内存池有固定大小的内存池和大小可变的内存池之分,它们被看 ...
随机推荐
- JQuery元素控制方法汇总
1.在元素内部追加内容 $("元素名").append(content) 2.在元素中的不同位置追加内容 $("元素名").appendTo(content) ...
- linux命令详解之netstat
今天在使用linux的时候,要查看端口号,但是不知道要使用哪一个命令所以就学习了一下,原来是使用netstat,接下来给大家一起来学习. 一.netstat介绍 1.1.简介 Netstat 命令用于 ...
- 将Excel中读取的科学计数法表示的Double数据转换为对应的字符串
已在SegmentFault提问,目前没有答案,自行实现如下: private static String getRealNumOfScientificNotation(String doubleSt ...
- iOS 数据压缩与解压
转自: http://blog.csdn.net/dkq972958298/article/details/53321804 在实际开发中,我们经常要对比较大的数据进行压缩后再上传服务器,下面是我在项 ...
- <UIKit>关于剪贴板共享数据
http://blog.sina.com.cn/s/blog_45e2b66c010102h9.html 上面这篇文章将剪贴板的使用方法基本上已经讲清楚了,参考这篇文章,再加上一个使用剪贴板共享数据 ...
- django-south使用 [转]
转自: http://alexliyu.blog.163.com/blog/static/16275449620126239949478/ 使用South之前铭记:请你一定要相信他的能力,抛弃对他的不 ...
- mysql中/*!40000 DROP DATABASE IF EXISTS `top_server`*/;这中注释有什么作用?
需求描述: 今天在进行mysqldump实验,使用--add-drop-databases参数,于是在生成的SQL文件中,就出现了. /*!40000 DROP DATABASE IF EXISTS ...
- brocadcastReceiver
用来接收广播, 可以根据系统发生的一些时间做出一些处理 系统的一些事件,比如来电,来短信,等等,会发广播:可监听这些广播,并进行一些处理: Android3.2以后,为了安全起见,对于刚安装的应用,需 ...
- poj_1151 线段树
题目大意 在平面上给定n个矩形,可以相互覆盖全部或者部分,求出矩形占据的总面积. 题目分析 将矩形按照x方向的进行分割之后,将平面沿着y方向划分一系列单元(不定高度),每个矩形在y方向上占据若干连续的 ...
- OpenGL ES2学习笔记(6)-- Line Strip和Line Loop
Line Strip 上一篇文章画了两条线段,但是用了4个点.如果几条线段首尾相接的话,可以让OpenGL把他们当成Line Strip来画,这样就可以用n+1个点来画n条线段. 代码 import ...