矢量初始化导致大量内存使用

Vector initialization causing massive memory usage

本文关键字:内存 初始化      更新时间:2023-10-16

我有一个问题,使一些向量占用大量的RAM。随着代码的进展,它会超过800 MB,最终导致std:bad_alloc错误,并终止。

我正在使用EasyBMP库,它有一个RGBApixel定义为代表红色,绿色,蓝色,alpha的4个无符号字符的结构体。我正在尝试制作各种可能的24位(TrueColor)像素的索引。

我知道这段代码太过了,有更好的方法来实现它。然而,这之前运行得很好,我不确定是否我甚至改变了任何事情来导致这个问题。

根据我的计算,这应该只占用64 MB,加上向量的一些开销。感觉它在某个点上是无限循环的,但我看了这段代码太长时间,以至于我无法理解它。如有任何帮助,不胜感激。
vector< vector<RGBApixel> > dict;
dict.reserve(16777216);
for (color r = 0; r < 256; r++)
{
    for (color g = 0; g < 256; g++)
    {
        for (color b = 0; b < 256; b++)
        {
            vector<RGBApixel> pixels;
            RGBApixel pixel;
            pixel.Red = r;
            pixel.Green = g;
            pixel.Blue = b;
            pixels.push_back(pixel);
            dict.push_back(pixels);
        }
    }
}

首先,让我们分析具有一个元素的vector<RGBApixel>的内存需求:

  • 有效载荷数据:4字节

  • std::vector<>实现的超额分配:可能是7*4字节= 28字节。

  • 动态内存分配开销:两个指针,即8或16字节,具体取决于您的体系结构。

  • vector<>本身的大小:两个指针= 8或16字节

这是48或64字节,取决于您的体系结构。

现在,让我们乘以16777216。我的计算器显示,这是805306368字节(=768 MiB)或1073741824字节(= 1 GB)。