吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 433|回复: 9
收起左侧

[讨论] STL的map有什么特殊机制吗

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

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

msn882 发表于 2024-9-19 18:57
是不是开了优化,这段代码完全被优化掉了
BigPanda 发表于 2024-9-19 19:22
原因很简单,因为你用的是rand函数,这个函数的随机数取值范围是[0, RAND_MAX],RAND_MAX的值是32767(这个值是否为C标准定义的不清楚,起码Windows平台是这样),所以你的std::map最多就只能存RAND_MAX个key,内存不会一直膨胀下去。你可以在每次循环结束打印一下map的长度,如下代码:

[C++] 纯文本查看 复制代码
#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函数,这个函数的随机数取值范围是[0, RAND_MAX],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函数,这个函数的随机数取值范围是[0, RAND_MAX],RAND_MAX的值是32767(这个 ...

膜拜大神
 楼主| Panel 发表于 2024-9-19 19:43
本帖最后由 Panel 于 2024-9-19 19:46 编辑

ok,我大概理解什么意思了,等我去测试
 楼主| Panel 发表于 2024-9-19 19:51
BigPanda 发表于 2024-9-19 19:22
原因很简单,因为你用的是rand函数,这个函数的随机数取值范围是[0, RAND_MAX],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以后验证了内存增长
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 11:43

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表