免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: dzbjet
打印 上一主题 下一主题

请问:关于string 赋值 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-08-04 09:31 |只看该作者
BS 在他的 The C++ Programming Language 里就是这么建议的。现在的实现应该都是这样做的了,毕竟每次都完整复制一个字符串,尤其是长字符串是很没效率的。

论坛徽章:
0
12 [报告]
发表于 2006-08-04 09:40 |只看该作者
但是频繁分配会不会引起内存碎片?
COW机制是不错,不过由于string对缓冲区都是分配在堆上的,因此频繁的赋值操作会导致内存碎片吧?
例如:
string s;
s.reserve(100); // a. 100个字节够用了,一次分配就可以了
但是如果:
s = string("another string buffer"); // b. 临时变量new了一个缓冲区
由于是COW,s的缓冲区就指向这个临时变量new的缓冲区了,而a处的缓冲区就释放了。如果这样的操作频繁,而且是乱序的,就会引起内存碎片吧?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
13 [报告]
发表于 2006-08-04 09:42 |只看该作者
原帖由 dzbjet 于 2006-8-4 09:40 发表
但是频繁分配会不会引起内存碎片?
COW机制是不错,不过由于string对缓冲区都是分配在堆上的,因此频繁的赋值操作会导致内存碎片吧?
例如:
string s;
s.reserve(100); // a. 100个字节够用了,一次分配就可 ...

这个不用担心,STL里有Alloc的管理,对于小内存的申请是用内存池实现的

对于楼主的需求,可以
s = s_another.c_str();
来实现

论坛徽章:
0
14 [报告]
发表于 2006-08-04 10:26 |只看该作者
to yuxh: 请问STL中,在那里有代码?实现Alloc的?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
15 [报告]
发表于 2006-08-04 13:28 |只看该作者
原帖由 dzbjet 于 2006-8-4 10:26 发表
to yuxh: 请问STL中,在那里有代码?实现Alloc的?

在STL的代码里找allocator.h

论坛徽章:
0
16 [报告]
发表于 2006-08-04 15:33 |只看该作者
我看了,linux下,c++: 3.4.3:
string -> basic_string -> allocator: 继承自 ___glibcxx_base_allocator
而#define ___glibcxx_base_allocator  __gnu_cxx::new_allocator
而 __gnu_cxx::new_allocator 我在/usr/include/c++/3.4.3/下,
在/usr/include/c++/3.4.3/ext/>new_allocator.h :

__gnu_cxx::new_allocator - An allocator that uses global new, as per [20.4].   



  1.       // NB: __n is permitted to be 0.  The C++ standard says nothing                                                                                       
  2.       // about what the return value is when __n == 0.                                                                                                      
  3.       pointer
  4.       allocate(size_type __n, const void* = 0)
复制代码



  1.       { return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp))); }
复制代码



因此,我觉得会出现内存碎片问题,因为STL中string缓冲区的分配是直接使用 new 分配的:<


而且我测试:
client -> server
发送数据包,异步方式
client端有个包缓冲池,大小为20000,包中的每个字段都是string类型的,并且每个字段我都reserve(21),而且包的赋值也是用pkt.field1 = field1.c_str()
发包一共:17780000个,以下是VmRss的变化:
VmRSS:     12172 kB
VmRSS:     12196 kB
VmRSS:     12200 kB
VmRSS:     12208 kB
VmRSS:     12216 kB
VmRSS:     12220 kB
VmRSS:     12224 kB
VmRSS:     12228 kB
VmRSS:     12232 kB
VmRSS:     12236 kB
VmRSS:     12240 kB
VmRSS:     12244 kB
VmRSS:     12248 kB
VmRSS:     12264 kB
VmRSS:     12268 kB
VmRSS:     12316 kB
VmRSS:     12320 kB
VmRSS:     12328 kB

[ 本帖最后由 dzbjet 于 2006-8-4 15:47 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2006-08-05 10:13 |只看该作者
没有办法,string全部用char[]代替了~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP