hash map 存成<string,string>这样占空间吗?

RollerFun 2013-01-31 09:46:25
hash map 存成<string,string>或者<string,long long int>这样。
1.当数据量过万后,会占大量栈空间吗?
2.如果单独把value存成结构体,里面替换成<string,strcut*>将value存在堆空间,会不会节省很多空间?
3.由于value替换成了指针, 是不是同时也减少了内存复制的过程,从而使得取value变得更效率?
...全文
535 16 点赞 打赏 收藏 举报
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
使用 febird.hash_strmap / gold_hash_map,又小又快
  • 打赏
  • 举报
回复
风行踩火轮 2013-02-04
引用 5 楼 lh48364758 的回复:
引用 3 楼 cheng7068 的回复:C++中用Map就可以了,不需要用Hash_Map的 嗯,不过重要的不是map或者hash_map。我不清楚的是,就一个string而言,几万条数据全放栈空间会不会很吃栈的空间从而影响整体程序?
这个肯定会影响的,我最近就在进行这方面的内存优化,没有找到具体的方法呢,郁闷的很
  • 打赏
  • 举报
回复
RollerFun 2013-01-31
非常感谢!!这个明白了,我再去看看map和hash_map存储的区别。
  • 打赏
  • 举报
回复
stereoMatching 2013-01-31
map<string,string> map<string,point*> 你的string和point*都是在heap上分配资源 差别在于point*的资源你需要自己动手delete string不用自己动手delete
  • 打赏
  • 举报
回复
stereoMatching 2013-01-31
我再说一篇,不管你在map里面放的是什么type都好 map的资源都是在heap上分配的 当你把资源往map里面放的时候,就代表你的资源是放在heap上的 绝对不是在stack上分配 诚心建议,快跑去读c++ primer 5
  • 打赏
  • 举报
回复
RollerFun 2013-01-31
引用 9 楼 stereoMatching 的回复:
把primer 5好好读一遍后,我保证你不会再对这类问题感到困惑 C/C++ code?12345template<typename T>struct A{ T *data_;} stl的vector,map, hash或list 底层都是透过pointer来动态分配你要 处理的资源--T的,所以他们的stack不会 因为你放了很多个T就膨胀 ……
可能我表达的不太清楚。 我需要存个map<string,string> 第二个string假定上限只有10个字节。比指针大,但大的不是太多,这样放在堆或者栈里,哪个更好一些? 如果是map<string,point*>第二个是指针我就不纠结了
  • 打赏
  • 举报
回复
RollerFun 2013-01-31
引用 8 楼 stereoMatching 的回复:
我不太懂你的意思 C/C++ code?123std::map<std::string, int> A;A.insert(std::make_pair("aaaa", 0));//insert几百万笔资料 这种形式的话,不管你insert的是几笔资料都好 stack的大小都一样 因为只有你的map会占用stack,map管理的资源 是不会占用stack的,不管他……
我需要一个 map<string,string>这种东西,但第二个string,我限制了他的空间假定只能放10个字符,这样它所占的空间比指针稍大,又不是大很多。但我的数据量有1万条。累计起来的数量就可能对栈有一定的威胁。 此时,第二个string它更合适是放在栈里还是堆里呢?
  • 打赏
  • 举报
回复
stereoMatching 2013-01-31
把primer 5好好读一遍后,我保证你不会再对这类问题感到困惑

template<typename T>
struct A
{
  T *data_;
}
stl的vector,map, hash或list 底层都是透过pointer来动态分配你要 处理的资源--T的,所以他们的stack不会 因为你放了很多个T就膨胀
  • 打赏
  • 举报
回复
stereoMatching 2013-01-31
我不太懂你的意思

std::map<std::string, int> A;
A.insert(std::make_pair("aaaa", 0));
//insert几百万笔资料
这种形式的话,不管你insert的是几笔资料都好 stack的大小都一样 因为只有你的map会占用stack,map管理的资源 是不会占用stack的,不管他们是XXX或YYY都一样 他们是放在heap中的 如果有那个stl可以动态把这些resource放在stack上 的话还请告诉我 如果你需要的是一个阵列,例如std::string A[100000] 那么你可以考虑使用std::vector<std::string> A(100000);
  • 打赏
  • 举报
回复
RollerFun 2013-01-31
引用 6 楼 stereoMatching 的回复:
..... C/C++ code?1234567struct A{ int a; int b;} auto a = new A; 请问a是保存在heap还是stack? 同理,stl的hash和map 底层也是靠pointer分配<type1, type2>的memory的 不管你放了几笔type1,type2 占用的stack都不会因此而膨胀,因为<……
我确实要存个类似您说的这种形式 string str; 所以担心膨胀的太多,毕竟存指针才4个字节,string就算限制长度了也不回太短。 所以那个string 是放在堆中好,还是直接写进map中?
  • 打赏
  • 举报
回复
stereoMatching 2013-01-31
.....

struct A
{
  int a;
  int b;
}

auto a = new A;
请问a是保存在heap还是stack? 同理,stl的hash和map 底层也是靠pointer分配<type1, type2>的memory的 不管你放了几笔type1,type2 占用的stack都不会因此而膨胀,因为<type1, type2>和 struct A一样,是放在heap上的 除非你是这样写再来担心会不会消耗太多stack吧

std::string A[100000];
  • 打赏
  • 举报
回复
RollerFun 2013-01-31
引用 3 楼 cheng7068 的回复:
C++中用Map就可以了,不需要用Hash_Map的
嗯,不过重要的不是map或者hash_map。我不清楚的是,就一个string而言,几万条数据全放栈空间会不会很吃栈的空间从而影响整体程序?
  • 打赏
  • 举报
回复
RollerFun 2013-01-31
引用 2 楼 taodm 的回复:
栈内存你可能不会测,堆内存你也不会自己看一下么? 没事别用hash_map,直接map就足够了。
堆里面有多少我都不担心,我只是担心就一个string 或者其他比四个字节大的类型,放在栈里会不严重吃栈的存储空间?因为栈的空间比堆的少太多了,当数据多了,能省就省啊!
  • 打赏
  • 举报
回复
风行踩火轮 2013-01-31
C++中用Map就可以了,不需要用Hash_Map的
  • 打赏
  • 举报
回复
taodm 2013-01-31
栈内存你可能不会测,堆内存你也不会自己看一下么? 没事别用hash_map,直接map就足够了。
  • 打赏
  • 举报
回复
RollerFun 2013-01-31
自己顶下!哪位大虾能给解释下呢!!
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言
加入

6.0w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2013-01-31 09:46
社区公告
暂无公告