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

时间:2014-05-19 18:22:39

标签: c++ vector

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

我正在使用EasyBMP库,它将RGBApixel定义为4个无符号字符的结构,表示红色,绿色,蓝色,alpha。我试图制作所有可能的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);
        }
    }
}

1 个答案:

答案 0 :(得分:3)

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

  • 有效载荷数据:4个字节。

  • std::vector<>实现的总体配置:可能是7 * 4字节= 28字节。

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

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

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

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