Panel 发表于 2024-9-19 18:38

STL的map有什么特殊机制吗

各位,如图,我使用该代码运行完后把程序挂起没退出,无论时在这个for循环过程中还是for循环结束都未见到对应程序内存增长,该内存在栈上?这完全不合理吧,理论上来说接近3GB的数据,请教是否std::map有着特殊的机制?欢迎留言讨论。

msn882 发表于 2024-9-19 18:57

是不是开了优化,这段代码完全被优化掉了

BigPanda 发表于 2024-9-19 19:22

原因很简单,因为你用的是rand函数,这个函数的随机数取值范围是,RAND_MAX的值是32767(这个值是否为C标准定义的不清楚,起码Windows平台是这样),所以你的std::map最多就只能存RAND_MAX个key,内存不会一直膨胀下去。你可以在每次循环结束打印一下map的长度,如下代码:

#include <iostream>
#include <chrono>
#include <ctime>
#include <Windows.h>
#include <atltime.h>
#include <sys/timeb.h>
#include <sys/types.h>
#include <map>

typedef unsigned long ULONG;

int main() {
        std::map<ULONG, ULONG> map;
        srand(time(0));
        printf("RAND_MAX: %d\n", RAND_MAX);

        for (size_t i = 0; i < 163840000; i++) {
                map.insert(std::make_pair(rand(), rand()));
                printf("%d\n", map.size());
        }
       
        return 0;
}

BigPanda 发表于 2024-9-19 19:23

BigPanda 发表于 2024-9-19 19:22
原因很简单,因为你用的是rand函数,这个函数的随机数取值范围是,RAND_MAX的值是32767(这个 ...

rand函数参考文档:https://learn.microsoft.com/zh-cn/cpp/c-runtime-library/reference/rand?view=msvc-170

lyrong2008 发表于 2024-9-19 19:38

BigPanda 发表于 2024-9-19 19:22
原因很简单,因为你用的是rand函数,这个函数的随机数取值范围是,RAND_MAX的值是32767(这个 ...

膜拜大神{:1_921:}

Panel 发表于 2024-9-19 19:43

本帖最后由 Panel 于 2024-9-19 19:46 编辑

BigPanda 发表于 2024-9-19 19:23
rand函数参考文档:https://learn.microsoft.com/zh-cn/cpp/c-runtime-library/reference/rand?view=msvc ...
ok,我大概理解什么意思了,等我去测试

Panel 发表于 2024-9-19 19:51

BigPanda 发表于 2024-9-19 19:22
原因很简单,因为你用的是rand函数,这个函数的随机数取值范围是,RAND_MAX的值是32767(这个 ...

感谢赐教,正如你所说,问题出在map的key不能重复,如果插入新的键值对的key是已经存在的只会更新value,而不会插入新的节点

michaelgao 发表于 2024-9-20 10:54

本帖最后由 michaelgao 于 2024-9-20 10:55 编辑

楼上BigPanda说的对,map的key值必须唯一,但rand函数最多产生0x7FFF个不同随机值,所以理论上无法满足您163840000个不同值的需求。
用一个longlong类型的变量做+1动作,作为key吧。

jjTest007 发表于 2024-9-20 11:52

map的key不可重复性加伪随机数,换成mulitmap后内存增长就明显了

Panel 发表于 2024-9-20 13:29

michaelgao 发表于 2024-9-20 10:54
楼上BigPanda说的对,map的key值必须唯一,但rand函数最多产生0x7FFF个不同随机值,所以理论上无法满足您16 ...

是的,我将i作为key以后验证了内存增长{:1_893:}
页: [1]
查看完整版本: STL的map有什么特殊机制吗