免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1482 | 回复: 2
打印 上一主题 下一主题

关于capacity的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-04 18:33 |只看该作者 |倒序浏览
c++ 的string有一个capacity方法,功能是返回当前分配给字符串的新内存块,而,reserve方法让你能够请求内存快的最小长度

c++ Primer Plus书上有个程序这样子的

  1. // str2.cpp -- capacity() and reserve()
  2. #include <iostream>
  3. #include <string>
  4. int main()
  5. {
  6.     using namespace std;
  7.     string empty;
  8.     string small = "bit";
  9.     string larger = "Elephants are a girl's best friend";
  10.     cout << "Sizes:\n";
  11.     cout << "\tempty: " << empty.size() << endl;
  12.     cout << "\tsmall: " << small.size() << endl;
  13.     cout << "\tlarger: " << larger.size() << endl;
  14.     cout << "Capacities:\n";
  15.     cout << "\tempty: " << empty.capacity() << endl;
  16.     cout << "\tsmall: " << small.capacity() << endl;
  17.     cout << "\tlarger: " << larger.capacity() << endl;
  18.     empty.reserve(50);
  19.     cout << "Capacity after empty.reserve(50): "
  20.          << empty.capacity() << endl;
  21.     return 0;
  22. }
  23. ~
复制代码

输出是:
Sizes:
      empty: 0
      small: 3
      larger:34
Capacityes:
      empty:15
      small:15
      larger:47
capacity after empty,reserve(50):63

而我的运行结果是
Sizes:
        empty: 0
        small: 3
        larger: 34
Capacities:
        empty: 0
        small: 3
        larger: 34
Capacity after empty.reserve(50): 50
问题1、两次结果不一样,是不是capacity和reserve的结果取决于编译器?
问题2、对于第二次的结果,size和capacity方法计算的结果是一样的,也不大理解。

论坛徽章:
0
2 [报告]
发表于 2007-03-04 19:21 |只看该作者
不同的stl实现有不同的capacity实现,楼主用的应该是SGI版的stl,sgi的stl有一组alloc模版管理内存分配的事务,所以独立对象就不必考虑内存预分配所以这里的capacity等于实际使用值

论坛徽章:
0
3 [报告]
发表于 2007-03-04 20:12 |只看该作者

回复 1楼 zwylinux 的帖子

>> 问题1、两次结果不一样,是不是capacity和reserve的结果取决于编译器?
>> 问题2、对于第二次的结果,size和capacity方法计算的结果是一样的,也不大理解。
对,不同编译器实现的库不尽相同,第一种结果表明是采用了预分配方案,而第二种结果表明该库没有采取预分配方案
标准只规定了标准库的实现应当保证:reserve(n)调用后,capacity()返回的大小至少是n(当然可以更大)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP