-
我不认为这与你使用什么样的容器有关,而是关于程序运行的环境和 L2 申请的内存大小。
首先,内存池是一种“时间空间”算法。
其次,如果 L2 每次都申请相同的内存量,使用内存池确实可以提高内存分配的效率。 否则,问题已经触及了操作系统中内存管理的概念,您可以参与有关内存分配计划的书籍。
至于效率,我个人认为这些链表操作并不复杂,只是对几个指针进行了修改和修改,自己编写的效率应该更高,我提倡DIY。
-
让我们从经典的内存池技术开始
经典内存池技术是一种用于分配大量相同大小的小对象的技术。 该技术可以大大加快释放内存分配的过程。 经典内存池仅涉及两个常量:
memblocksize、itemsize(小对象的大小,但不小于指针的大小,在 32 位平台中不能小于 4 个字节)和两个指针变量 memblockheader 和 freenodeheader。 首先,两个指针都是空的。 指针变量 memblockheader 是一个链表,它将所有应用的内存块(memblocks)串成一个链表,以便它可以释放所有应用的内存。
freenodeheader 变量将所有可用内存节点(freenodes)串成一个链。
内存请求过程分为两种方案:
在可用内存节点中,链表(freenodelist)不为空。 分配过程只是从链表中删除节点的过程。
否则,这意味着需要一个新的内存块。 这个过程涉及将新应用的 memblock 切成多个节点并将它们串在一起。 这就是内存池技术的开销所在。
Mempool 技术适用于内存,释放内存的速度非常快(比 autofreealloc 慢)。 大多数情况下,内存分配过程的复杂度为 o(1),主要开销是当 freenodelist 为空,需要生成新的内存块时。 内存释放过程的复杂度为 o(1)。
因此,房东提前申请了 L1 的内存,而 L2 没有分配,所以主要开销是在 L2 为空时申请内存,即在 L2 将交汇点返回给 L1 后再次分配内存,而不是为 L1 申请内存。
如需个人见解和讨论,请发送电子邮件。
-
1 如果 l2 的内存大小相同,应该没问题,因为即使使用推回也会比重新分配内存小一点2 如果使用容器,可以自己预分配节点,所以似乎没有必要再用 l1(我用的向量比较多,里面可以预分配内存)3 一般来说, 很少看到在单独的内存池中分配单个数据,例如数据库中的索引,它在单个分配中分配了 30% 以上的节点,以加快运行速度,并且仅在它已满时。
-
我不太了解,太专业了。
是的,DDR800 也会自动降频到 667 形成双通道,但是你的内存最好选择相同的品牌和粒子,否则难免会出现兼容性问题! >>>More