c++ - 分配大的多维向量会导致内存“过冲”
问题描述
在使用大型多维 std::vector 变量时,我观察到了意外的行为。特别是,当我分配一个大尺寸的 4 维向量时,可以看到,使用内存分析器,我的任务很快就会使用比变量所需的更多内存。
重现此行为的 MWE 如下:
#include <vector>
#include <iostream>
int main(int argc, char *argv[]){
getchar();
std::vector<std::vector<std::vector<std::vector<int64_t>>>> F(1, std::vector<std::vector<std::vector<int64_t>>>(15, std::vector<std::vector<int64_t>>(256, std::vector<int64_t>(100000, 0))));
getchar();
}
下图显示了任务使用的内存。阵列的大小大约需要 3GB,但是内存使用量很快就会超过 6GB。请注意,向量的最后一个维度是最大的,这意味着向量类的内存开销相对较小。
这已在 64 位系统上的 Manjaro 下观察到,使用 g++(gcc 版本 11.1.0 (GCC))编译。我使用psrecord来记录内存使用情况。有趣的是,我无法为低维向量重现相同的行为。即使我只删除第一个维度(大小为 1),我也无法在我的系统上重现此过冲。
有谁知道这是从哪里来的,或者是否可以避免(不使用大的一维向量)?这样做的主要问题是我的操作接近系统提供的最大内存,这意味着短暂的过冲会导致内存交换。
我会很高兴有任何想法和评论。提前致谢。
解决方案
除了解释问题根源的@amon、@NathanOliver 和@Top-Master 的评论之外,我将提供一个解决问题的代码示例。
#include <vector>
#include <iostream>
int main(int argc, char *argv[]){
getchar();
std::vector<std::vector<std::vector<std::vector<int64_t>>>> F(1, std::vector<std::vector<std::vector<int64_t>>>(15, std::vector<std::vector<int64_t>>(256)));
for (int i=0; i<15; i++) for (int j=0; j<256; j++) F[0][i][j] = std::vector<int64_t>(100000, 0);
getchar();
}
推荐阅读
- unity3d - 如何在 Destroy() 上播放声音
- swift - 硬编码 PPS 和 SPS 参数时,无法使用 VideoToolbox 解压缩 H.264 帧
- c - C:做一个方程只出现一次
- c++ - 显式实例化 CRTP 的正确方法是什么?
- php - PHP - 如何更改 HTML 表格的字体大小?
- r - 在 dplyr 中处理整数范围
- c# - 将私有 RSACryptoServiceProvider blob 导入 CNGKey.Import
- ssms - 如何修复此 SQL Server Management Studio 错误?
- dart - Dart 2 异步包预编译错误
- c# - .NET 之类的 PHP 实体框架