public Sign(string message, string name, int id, float a, float b, float c, float d, int posX, int posY)
:base(name,id,a,b,c,d,posX,poxY)
public Sign(string message) : base("a name", 1, 1, 2, 3, 4, 10, 10)
一次分配时,使用的内存大约为4GB
typedef struct node{
unsigned int v;
struct node* next;
}Node;
并且在动态分配每个节点时,使用的内存几乎翻倍至大约8GB
Node* X= (Node*)malloc(sizeof(Node)*((long)1<<28));
理想情况下,如果其他所有内容保持不变,则两者都应占用相同数量的内存。但事实上它并没有发生在第二种方法中存在一些簿记的开销。
请详细解释为什么会这样。我会很感激细节,比如用于簿记的数据结构,我们可以用它来计算内存的预期用量。
P.S我使用的是64位机器(8字节指针)和gcc 4.4.7编译器。
我正在访问所有已分配的节点,因此使用的虚拟内存和RAM是相同的。没有智能分配。
如果有人能抽出时间对发生的一切事情做出详细解答,我会很乐意透露有关我的系统的任何细节。
答案 0 :(得分:3)
可用内存相同。但是每次分配都会产生开销。
1<<28
开销肯定超过1个开销。
需要了解平台,编译器和选项(包括打包)的更多细节。原因因许多组合而异。
如@M.M所述,各种分配者以各种方式处理簿记。通常,它是快速分配/解除分配和内存使用效率之间的权衡。
包装可能会影响事物。如果OP可以控制包装选项,那么分配大小的可能性将减少 - 可能不成比例。该结构似乎可能是12字节。 (不是2的幂)因此可能有利于(尺寸)包装,但成本降低了访问性能。
另一个影响是所谓的内存使用量的可信度为~4GB和~8GB。智能分配器分配,但在写入有趣的内容之前,不要 使用内存。见Why is malloc not “using up” the memory on my computer?
答案 1 :(得分:1)
每个malloc
'd块都带有一定的开销,与每个malloc
'd块相关联的可用大小通常比您请求的大一点。 (您可以找到与我的调用malloc_usable_size(chunk_ptr);
(原型位于malloc.h
)中的块相关联的可用大小。)