-2

运行以下代码后:

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

4

2 回答 2

0

C++ 内存管理器随心所欲地处理分配。间隙比对象大,因为管理器需要额外的信息来了解哪些内存被占用,哪些是空闲的。由于内存填充,所有块都具有相同的大小,以提高效率。请注意,如果您尝试分配大对象,间隙会扩大,很可能是 64 的倍数。分配对象之间的间隙是相同的,因为您按顺序分配它们 - 堆叠新对象是最简单的分配策略。请注意,如果分配不是按顺序分配的,或者如果有可用内存的“空洞”,那么间隙就不会那么均匀。

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

于 2012-10-16T17:23:07.613 回答
0

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

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

于 2012-10-16T16:59:45.300 回答