2

好的,所以我很想知道一个 int 是否真的在我的 ram 上重 4 个字节。
所以我用这段代码做了 1,000,000 个整数。

for(int i = 0;i < 1000000;++i)   
    int *as= new int;  

在我执行这行代码之前,我在前面放置了一个断点,以查看我开始使用的headover 量。
几乎没有前导,我的程序以 750 kb 开始。

但是在我完成循环后,如果一个 int 重 32 位,程序假定为 4,000 kb 时使用 32,000 kb。
另一件值得一提的是,我正在使用ctrl+altk + delete方法来检查我的程序从 ram 中占用了多少空间,并且我正在 Visual c++ 2010 express 上运行它。

我也很肯定我的电脑上的 int 是 32 位而不是 64 并不重要,因为即使它是 64 而不是 32,它也应该是 8,000 kb 而不是 32,000 kb。
所以也许您可以尝试在您的电脑上执行此操作并告诉我您是否有相同的结果。

如果你知道我哪里出错了,请告诉我。

4

4 回答 4

6

4 字节的内存块太小,不值得管理。提供共享缓存行的可能不相关的代码对象块也可能导致性能损失。

典型的内存管理器的最小块大小在 16 到 256 字节之间。此外,通常需要一些开销来跟踪已分配特定大小的块的事实。

于 2012-09-27T22:53:23.387 回答
3

内存管理器有一些开销来跟踪不同的块。他们还可以分配额外的位来帮助发现缓冲区溢出。有些具有他们将分配的最小大小的块。

于 2012-09-27T22:53:34.527 回答
2

有一些与堆分配相关的开销,因为堆管理器提供的每个内存块都有一些与之相关的额外信息(例如,它的大小)。

此外,通常堆管理器不提供这么小的块,因为几乎没有人要求int从堆中获取单个 s(除其他外,前面提到的额外簿记使如此小的分配成为一个坏主意);因此,int您获得的每个可能都是堆管理的最小内存块,比int.

于 2012-09-27T22:56:34.490 回答
1

您在堆而不是堆栈上分配整数指针。

我看到每个分配的 int 有 4 个字节(32 位),但每个指针也有 8 个字节(64 位)和内存分配的分配开销。

于 2012-09-27T22:56:09.593 回答