我有一个问题,即制作一些向量占用了大量的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);
}
}
}
答案 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)。