C++标准库中的string内存是分配在堆上面吗?

luo6620378xu 2013-01-23 08:34:13


例如我声明一个string变量。
string str;
一直不停的str.append("xxxxx");时,str会不停的增长。

我想问的是这个内存的增长,标准库中的string会把内存放置到堆上吗?

另外STL中的其他容器是否遵循相同的规则。

谢谢!
...全文
2752 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hoodlum1980 2015-06-03
  • 打赏
  • 举报
回复
引用 2 楼 sduxiaoxiang 的回复:
16以内在栈上,超过以后在堆上。

此回答对应于是正确的。(当然,这句话的答案省略了楼主的问题的前提条件:【在栈上构造的 string 对象】,如果string 是 new 出来的即在堆上构造的,当然内部的缓冲区总是在堆上的)。

这个说法是限于观察 windows 系统的 visual stdio 2005 带的 stl 的源码来说的。当然,stl 属于 c++ 标准,是平台无关的。

在 basic_string 类内部有一个指代实际缓冲区的 union,因此 string 对象构造后,内部就具有一个 16 Bytes 的小缓冲区,当字符串内容很小的时候,先使用这个 16 Bytes 的小缓冲区,当字符串内容增长的更大时,它才会在堆上重新分配新的缓冲区。因此在栈上构造的 string,当字符串尺寸小于 16 bytes 时,string.c_str() 也是位于栈上的空间。当字符串尺寸超过 16 bytes,则 c_str() 就会位于堆上了。



jlcm1234567 2013-01-27
  • 打赏
  • 举报
回复
是堆上的内存。栈内存编译时定死了,不能在运行时动态增长。
ForestDB 2013-01-24
  • 打赏
  • 举报
回复
大了只有堆放得下。
leez0301 2013-01-24
  • 打赏
  • 举报
回复
string的内存肯定是在堆上的,string内部自己维护一个申请和释放的指针,你外部应用是不用关心空间的申请,它内部会从堆上申请控件,析构时释放空间。
eagleatustb 2013-01-24
  • 打赏
  • 举报
回复
放到哪里主要是看他的allocator实现吧
赵4老师 2013-01-24
  • 打赏
  • 举报
回复
提醒楼主:string源码就是文件include\string本身,不要被其没有文件名后缀欺骗。
luo6620378xu 2013-01-24
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
提醒楼主:string源码就是文件include\string本身,不要被其没有文件名后缀欺骗。
嗯,是的。标准C++头文件都是不带后缀的。string是字符模板,所以是实现在头文件中。 C++的 export好像gnu的G++不支持。
zhouzhipen 2013-01-23
  • 打赏
  • 举报
回复
引用 5 楼 luo6620378xu 的回复:
引用 2 楼 sduxiaoxiang 的回复:16以内在栈上,超过以后在堆上。 看来是看过某个实现版本源代码的淫啊!
MS的STL实现是这样的,短字符串在栈上分配有助于CPU提高Cache命中率。
luo6620378xu 2013-01-23
  • 打赏
  • 举报
回复
引用 2 楼 sduxiaoxiang 的回复:
16以内在栈上,超过以后在堆上。
看来是看过某个实现版本源代码的淫啊!
lee_鹿游原 2013-01-23
  • 打赏
  • 举报
回复
引用 3 楼 luo6620378xu 的回复:
引用 1 楼 xiaohutushen30 的回复:肯定是堆里面的内存呀!看一下他的源代码实现就知道了! 有道理,如果一直在栈上,肯定会爆掉
luo6620378xu 2013-01-23
  • 打赏
  • 举报
回复
引用 1 楼 xiaohutushen30 的回复:
肯定是堆里面的内存呀!看一下他的源代码实现就知道了!
有道理,如果一直在栈上,肯定会爆掉
sduxiaoxiang 2013-01-23
  • 打赏
  • 举报
回复
16以内在栈上,超过以后在堆上。
xiaohutushen30 2013-01-23
  • 打赏
  • 举报
回复
肯定是堆里面的内存呀!看一下他的源代码实现就知道了!

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧