矢量初始化导致大量内存使用
Vector initialization causing massive memory usage
我有一个问题,使一些向量占用大量的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)。
相关文章:
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 如何在 malloc 内存中初始化非 POD 数据
- 犰狳C++ - 从常量内存初始化只读矩阵而不复制
- 内存清理程序报告全局对象构造中未初始化值的使用
- 如何根据C++在同一内存位置重新初始化 C# 中的对象(还是自动完成)?
- 为什么"std::uninitialized_copy"通常取消对未初始化内存的迭代器的引用不是未定
- 为什么未初始化的内存位置的值给出 -842150451 的值?
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- 获取有关使用未初始化内存的错误代码
- 初始化值是否保证通过其自己的地址反映,而不考虑内存顺序
- 未找到匹配的运算符删除;如果初始化引发异常,内存将不会被释放
- Clang++ 6.0 内存清理器未报告返回值指示条件分支的函数中的未初始化局部变量
- 在不放置新运算符的情况下,在预分配的内存上使用虚函数初始化对象 - 这可能吗?如果没有,为什么
- 取消初始化内存区域
- 初始化原子指针是原子的吗?如果初始化或内存分配引发,会发生什么情况?
- 如何使用构造函数初始化内存地址(指针变量)?
- 将类复制到未初始化的内存中是否安全?
- 内存初始化/删除这么耗时吗
- 共享内存初始化和访问
- 编译器特定的内存初始化