STL的map有什么特殊机制吗
各位,如图,我使用该代码运行完后把程序挂起没退出,无论时在这个for循环过程中还是for循环结束都未见到对应程序内存增长,该内存在栈上?这完全不合理吧,理论上来说接近3GB的数据,请教是否std::map有着特殊的机制?欢迎留言讨论。是不是开了优化,这段代码完全被优化掉了 原因很简单,因为你用的是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:22
原因很简单,因为你用的是rand函数,这个函数的随机数取值范围是,RAND_MAX的值是32767(这个 ...
rand函数参考文档:https://learn.microsoft.com/zh-cn/cpp/c-runtime-library/reference/rand?view=msvc-170 BigPanda 发表于 2024-9-19 19:22
原因很简单,因为你用的是rand函数,这个函数的随机数取值范围是,RAND_MAX的值是32767(这个 ...
膜拜大神{:1_921:} 本帖最后由 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,我大概理解什么意思了,等我去测试 BigPanda 发表于 2024-9-19 19:22
原因很简单,因为你用的是rand函数,这个函数的随机数取值范围是,RAND_MAX的值是32767(这个 ...
感谢赐教,正如你所说,问题出在map的key不能重复,如果插入新的键值对的key是已经存在的只会更新value,而不会插入新的节点 本帖最后由 michaelgao 于 2024-9-20 10:55 编辑
楼上BigPanda说的对,map的key值必须唯一,但rand函数最多产生0x7FFF个不同随机值,所以理论上无法满足您163840000个不同值的需求。
用一个longlong类型的变量做+1动作,作为key吧。 map的key不可重复性加伪随机数,换成mulitmap后内存增长就明显了 michaelgao 发表于 2024-9-20 10:54
楼上BigPanda说的对,map的key值必须唯一,但rand函数最多产生0x7FFF个不同随机值,所以理论上无法满足您16 ...
是的,我将i作为key以后验证了内存增长{:1_893:}
页:
[1]