|
|
1
1
根据我的经验,选项2更容易使用,开销最小。重新分配 没有 保证它会增加现有内存的大小。实际上,几乎从来没有。如果您使用它,您将需要返回并重新映射所有旧对象。这就需要你记住每个分配的对象在哪里。。。那可能比头顶高出一吨。 但如果不知道你使用的是什么标准,就很难确定“最有效”。
对于每个分配,确定分配对象的大小。 我看一个链接列表的自由对象的大小,看看是否有任何东西已被释放,如果是这样,采取第一个自由 2在查找表中查找,如果找不到 2.1分配一个由N个被分配大小的对象组成的数组。
3.1如果数组已满,请添加新页。 N个对象可以通过编程来实现。如果您知道您有一百万个16字节的对象,您可能希望N稍微高一点。
免费: 确定对象的大小,将其添加到空闲链接列表中。 如果分配的对象的大小小于指针的大小,则链接列表不需要产生任何内存开销。只需使用已经分配的内存来存储节点。
|
|
|
2
0
您的问题不清楚为什么需要提前分配一大块内存,而不是根据需要为每个对象分配内存。我假设您将它用作连续数组。不然的话,这样做更有意义
所以,如果你把它当作一个数组,
|
|
|
3
0
你还没有给出你正在试验的平台的任何细节。有一些性能差异
我的建议是使用第二种方法,或者使用自定义分配器(您可以实现一个简单的 buddy allocator [2] 您还可以使用更高级的内存分配器,如 |
|
|
4
0
根据您期望执行realloc/malloc的次数,它可能是一个有用的想法,也可能是一个无用的想法。反正我也会用malloc。 自由战略取决于实施。要将所有页面作为一个整体释放,只需“遍历”它们就足够了;我不使用数组,而是使用链接的“pages”:将sizeof(void*)添加到“page”大小,您可以使用额外的字节来存储指向下一页的指针。 如果您必须释放一个位于其中一个页面中任意位置的对象,它会变得稍微复杂一些。我的想法是保留一个非连续自由“块”/“槽”列表(适合容纳任何对象)。当请求一个新的“块”时,首先从这个列表中弹出一个值;如果它是空的,那么您将在最后一个正在使用的页面中获得下一个“slot”,并最终触发一个新页面。释放一个对象,意味着把空槽地址放在堆栈/列表中(不管你喜欢用什么)。 |
|
|
5
0
|
|
|
6
0
选项1.为了提高效率,新的\u大小必须非线性地依赖于旧的大小。否则,由于冗余复制,您可能会遇到realloc()的O(n^2)性能。我通常是这样
最后,这完全取决于分配新对象的频率以及如何处理释放。如果用#1分配大量数据,则在展开时会有一些冗余的复制,但释放非常简单,因为所有对象都在同一页中。如果您需要释放/重用对象,那么使用#2您将花费一些时间浏览页面列表。 根据我的经验#2更好,因为移动大内存块可能会增加堆碎片的速率。#2还允许使用指针,因为对象不会更改其在内存中的位置(不过对于某些应用程序,我更喜欢使用pool#id/索引对,而不是原始指针)。如果以后遍历页面成为一个问题,它可能会过于优化。
|
|
|
MaPo · Linux,设置锁定ICMP_过滤器选项 1 年前 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 1 年前 |
|
|
Bobby · 复合字面值总是左值吗? 1 年前 |
|
9-Pin · C: 嵌套结构的堆栈内存分配 1 年前 |