我正在制作一个图片编辑程序,我一直在分配内存.我不知道发生了什么事.
好的..所以当我这样做时:
std::vector<unsigned char> h;
for (int a = 0; a < 10000 * 10000 * 3; a++) {
h.push_back(0);
}
Run Code Online (Sandbox Code Playgroud)
这很好(对不起我不得不),但当我这样做时:
std::vector<std::vector<std::vector<unsigned char>>> h;
for (uint32_t a = 0; a < 10000; a++) {
h.push_back({});
for (uint32_t b = 0; b < 10000; b++) {
h.at(a).push_back({});
for (uint32_t c = 0; c < 3; c++) {
h.at(a).at(b).push_back(0xff);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的内存使用情况爆炸,我收到错误:Microsoft C++异常:std :: bad_alloc在内存位置0x009CF51C
我正在使用.bmp.
目前,代码处于测试模式,所以它基本上是一个巨大的混乱...我15岁,所以不要指望我.
我正在寻找解决方案,但我发现的只是如何处理大整数等等......
如果你可以给我另一种解决方案,但我希望我的代码能够像初学者一样友好.
这是由于开销vector<char>.具有3个元素的每个这样的对象不需要3个字节,但可能是4个(由于重新分配策略),加上3个指针可能需要3*8 = 24个字节.总体而言,您的结构需要的内存是其可用内存的9.3倍.
如果用数组替换内部向量,它将开始工作,因为数组没有这个开销:
std::vector<std::vector<std::array<unsigned char, 3>>> h;
for (uint32_t a = 0; a < 10000; a++) {
h.emplace_back();
for (uint32_t b = 0; b < 10000; b++) {
h.at(a).emplace_back();
for (auto &c : h.at(a).at(b)) {
c = 0xff;
}
}
}
Run Code Online (Sandbox Code Playgroud)
另一种选择是将较小的尺寸放在第一位.
| 归档时间: |
|
| 查看次数: |
104 次 |
| 最近记录: |