0

我为 100000000 个节点运行 c++ 单链表附加操作,该节点每次在 0-10 之间取随机数,在 centos 64bit 中,每个节点的大小为 16,因此它将为 1600000000 但根据任务管理器显示为 30.53mb对于每个节点。

节点类包含 int 数据和下一个节点*,就是这样。

我的问题:

1.为什么会这样?

2.有什么具体的方法可以获得相同的大小吗?

4

2 回答 2

2

正在分配的所有“块”内存都有开销,每次分配通常为 16-64 字节。

如果您连续进行两次内存分配,那么它们相距多远。例如

char *a = new char;
char *b = new char;

std::cout << b-a << std::endl;

delete a;
delete b;

(是的,在其他人指出之前:从技术上讲,这段代码是未定义的行为。但是在 x86-64 机器上,内存是一个平面内存模型,所以从另一个指针中减去一个指针应该会给你两个对象之间的距离。该标准不允许“不同分配的内存之间的差异”的原因之一是该体系结构可能使用分段内存 a'la 16 位 OS/2,其中每个分配都有自己的段,并且一个段有它自己的基地址,用户模式应用程序不知道基地址,所以不可能使用这种技巧)

于 2013-09-02T09:18:45.933 回答
0

你如何为你的列表创建节点?new? malloc? 所有这些内存分配函数都会消耗一些额外的空间来进行内存管理(例如,释放和回收内存)。当您分配大量小块内存时,这种开销最为明显。

我认为这就是您看到的这种内存开销的原因。

您可以尝试以下方法:

  • 如果您只分配相同大小的小块 - 尝试使用固定数组(或仅分配一次数组),然后使用指向数组元素的指针作为next列表节点的成员。
  • 您还可以尝试其他实现malloc,例如tcmalloc
于 2013-09-02T09:02:53.477 回答