我为 100000000 个节点运行 c++ 单链表附加操作,该节点每次在 0-10 之间取随机数,在 centos 64bit 中,每个节点的大小为 16,因此它将为 1600000000 但根据任务管理器显示为 30.53mb对于每个节点。
节点类包含 int 数据和下一个节点*,就是这样。
我的问题:
1.为什么会这样?
2.有什么具体的方法可以获得相同的大小吗?
我为 100000000 个节点运行 c++ 单链表附加操作,该节点每次在 0-10 之间取随机数,在 centos 64bit 中,每个节点的大小为 16,因此它将为 1600000000 但根据任务管理器显示为 30.53mb对于每个节点。
节点类包含 int 数据和下一个节点*,就是这样。
我的问题:
1.为什么会这样?
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,其中每个分配都有自己的段,并且一个段有它自己的基地址,用户模式应用程序不知道基地址,所以不可能使用这种技巧)
你如何为你的列表创建节点?new
? malloc
? 所有这些内存分配函数都会消耗一些额外的空间来进行内存管理(例如,释放和回收内存)。当您分配大量小块内存时,这种开销最为明显。
我认为这就是您看到的这种内存开销的原因。
您可以尝试以下方法:
next
列表节点的成员。malloc
,例如tcmalloc