运行以下代码后:
#include <stdio.h>
class Nil
{
};
int main()
{
Nil* A[20];
char* B[20];
for (int i=0;i!=20;i++)
{
A[i]=new Nil;
}
for (int i=0;i!=19;i++)
{
printf("A:%i\n",((int)A[i+1])-((int)A[i]));
}
printf("------------------------------------\n",5);
for (int i=0;i!=20;i++)
{
B[i]=new char;
}
for (int i=0;i!=19;i++)
{
printf("B:%i\n",((int)B[i+1])-((int)B[i]));
}
getchar();
}
输出:
A:7112
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
A:64
------------------------------------
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
B:64
为什么分配大小总是64?
答案 0 :(得分:0)
你在那里拿着指针数组。 指针确实有固定的大小,所以它总是一样的。
对于分配的内存,编译器会进行一些优化。通常,您无法查找单个位或字节,因此大多数编译器会注意您拥有最佳访问模式。
答案 1 :(得分:0)
C ++内存管理器随意处理分配。差距大于对象,因为管理器需要额外的信息来知道采取什么内存和什么是免费的。由于内存填充,所有块都具有相同的大小,以提高效率。请注意,如果您尝试分配大对象,则间隙会变宽,最有可能是64的倍数。分配的对象之间的差距是相同的,因为您按顺序分配它们 - 堆叠新对象是最简单的分配策略。请注意,如果分配不是按顺序排列,或者存在空闲内存的“漏洞”,那么差距就不会那么均匀。
要记住的重要一点是,所有这些都是依赖于实现和平台的,不应该依赖它。