C ++内存分配类Nil

时间:2012-10-16 16:36:31

标签: c++ new-operator

运行以下代码后:

#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?

2 个答案:

答案 0 :(得分:0)

你在那里拿着指针数组。 指针确实有固定的大小,所以它总是一样的。

对于分配的内存,编译器会进行一些优化。通常,您无法查找单个位或字节,因此大多数编译器会注意您拥有最佳访问模式。

答案 1 :(得分:0)

C ++内存管理器随意处理分配。差距大于对象,因为管理器需要额外的信息来知道采取什么内存和什么是免费的。由于内存填充,所有块都具有相同的大小,以提高效率。请注意,如果您尝试分配大对象,则间隙会变宽,最有可能是64的倍数。分配的对象之间的差距是相同的,因为您按顺序分配它们 - 堆叠新对象是最简单的分配策略。请注意,如果分配不是按顺序排列,或者存在空闲内存的“漏洞”,那么差距就不会那么均匀。

要记住的重要一点是,所有这些都是依赖于实现和平台的,不应该依赖它。