Chinaunix

标题: 关于capacity的疑问 [打印本页]

作者: zwylinux    时间: 2007-03-04 18:33
标题: 关于capacity的疑问
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方法计算的结果是一样的,也不大理解。
作者: lcstudio    时间: 2007-03-04 19:21
不同的stl实现有不同的capacity实现,楼主用的应该是SGI版的stl,sgi的stl有一组alloc模版管理内存分配的事务,所以独立对象就不必考虑内存预分配所以这里的capacity等于实际使用值
作者: tyc611    时间: 2007-03-04 20:12
标题: 回复 1楼 zwylinux 的帖子
>> 问题1、两次结果不一样,是不是capacity和reserve的结果取决于编译器?
>> 问题2、对于第二次的结果,size和capacity方法计算的结果是一样的,也不大理解。
对,不同编译器实现的库不尽相同,第一种结果表明是采用了预分配方案,而第二种结果表明该库没有采取预分配方案
标准只规定了标准库的实现应当保证:reserve(n)调用后,capacity()返回的大小至少是n(当然可以更大)




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2