在循环中执行移位操作时C ++中的内存泄漏

短信

我设法将问题简化为以下代码,该代码在笔记本电脑上运行时将占用近500MB的内存-进而在完整程序中导致std :: bad_alloc。这里有什么问题?据我所知,无序映射仅使用(32 + 32)* 4096 * 4096位= 134.2MB之类的东西,这甚至与程序使用的内容并不接近。

#include<iostream>
#include<unordered_map>

using namespace std;

int main()
{
    unordered_map<int,int> a;
    long long z = 0;

    for (int x = 0; x < 4096; x++)
    {
        for (int y = 0; y < 4096; y++)
        {
            z = 0;

            for (int j = 0; j < 4; j++)
            {
                    z ^= ((x>>(3*j))%8)<<(3*j);
                    z ^= ((y>>(3*j))%8)<<(3*j + 12);
            }

        a[z]++;
        }
    }
    return 0;
}

编辑:我知道这里的某些移位会导致不确定的行为,但是我99%的肯定那不是问题所在。

EDIT2:实际上,我需要计算给定集合中某些函数映射到第二个集合(大小为4096 * 4096)中每个y的x的数量。将这些数字存储在数组中会更好吗?即我有一个函数f:A到B,我需要知道B中每个y的集合{A中的x:f(x)= y}的大小。在这种情况下,A和B都是小于2 ^ 12 = 4096的非负整数。(理想情况下,我想将此范围扩展到2 ^ 32)。

盖泽

...占用将近500MB的内存...这是什么问题?

就您观察到的内存使用而言,本质上并没有真正的问题。std::unordered_map构建用于快速运行大量元素。因此,内存并不是头等大事。例如,为了优化调整大小,它通常在创建时为一些预先计算的哈希链分配同样,您对元素计数乘以元素大小的度量未考虑此映射中每个节点的实际内存占用量(按数据结构)–至少应包含一些指向相邻元素的指针在它的存储桶列表中

话虽如此,目前尚不清楚您是否需要std::unorderd_map在这种情况下使用相反,给定映射,您的尝试存储定义为

{B中的每个y的{x in A:f(x)= y}

您可能有一个固定大小的数组(std::array用于该数组),该数组将简单地容纳每个索引i,代表集合B中的元素,即集合A中满足条件的元素的数量

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章