Just for i0'

Love i0

vector::capacity

vector::capacity
: Returns the number of elements that the vector could 
    contain without allocating more   storage.

vector的capacity()调用返回vector中最大能够存储的元素个数.
当有新的元素插入的时候(vector::push_back)需要扩充容量,于是capacity的值就变化。而不同的组织可以制订自己的变化规则,即对capacity不同的实现。

注:reserve会使容器在必要的时候增长,以便容纳指定数目的元素。
vector<int> v;
v.reserve(10);
cout << v.capacity() << endl; //10

那么在linux:(kernel2.6.9)gcc下:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector <int> v;
for(int i=0;i<40;i )
{
v.push_back(i);
cout<< v.capacity()<<endl;

}
return 0;
}

将输出: 1 2 4 8 16 .... 2^n

上述程序在windows vc6.0下:
将输出: 1 2 3 4 6 6 9 9 9 ....
显然不是2^n的关系,如果有那是什么呢?
x+ [x/2];

注意:如果先分配capacity=10,那么插入一个元素后就变为:10+5=15(gcc)

比较起来就是: 前者: x +x ; 后者: x +[x/2]; 

 例如:
同样的cpu和内存下测试i=(0, 4000):
linux gcc:30000ms
window vc6.0:4515ms
注意:在打印的情况下,打印也会占用很多时间
上述的试验数字具有不可再现性。


而我们要做的应该是充分认识这一点,并且有效的利用这个特性。
比如:
在插入大量小对象时  是gcc比较好,还是vc的比较好?
大对象的时候呢 ?

关于效率的讨论将是下一步的事
 

 


posted on 2006-03-06 12:25 for_I0 阅读(1450) 评论(4)  编辑 收藏 引用

Feedback

# re: vector::capacity 2006-03-06 14:09 cf

楼主你总结的“不同”是库实现的不同,而不是编译器的不同  回复  更多评论   

# re: vector::capacity 2006-03-06 19:30 for_Linda

@cf 你说的很对!
我们知道
编译器完成了代码的语法分析和词法分析以及目标代码的生成等,
如果我们调用库函数,那么编译的时候就会从编译器的库中取来函数的相应地址来代替我们的调用函数,所以本质上是库实现的不同这毫无疑问。
只不过通过编译器体现而已。

而且我们知道c/c++标准组织只是给了我们函数的标准接口,而不同的组织给出自己的实现。gcc 和vc的确在capacity上实现不同造成了如上所说。

谢谢cf


  回复  更多评论   

# re: vector::capacity 2006-03-13 17:22 沐枫网志

如果你用的是stlport,那么它在vc下的表现也会与vc原先的表现不一样。
那么请问,vc6编译器本身,难道又可以有什么不同吗?

另外,内存分配策略,对于这两种实现来说,并没有什么优劣。假如你对内存分配有特殊要求,或者是内存有限制,或者是要求高性能,你还可以自定义内存分配策略。这都是标准库提供的接口,可以很方便的重定义,这和编译器是无关的。  回复  更多评论   

# re: vector::capacity 2006-03-13 18:45 for_Linda

我没有在stlport测试 , 其实现的capacity()当然与vc6下的实现可能不同。
的确在这里 认为与编译器有关 是不妥的;应该是无关的。
capacity的外在表现决定于capacity的实现代码。  回复  更多评论   



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理