vector的内存分配:之前看一些书和博客都是说capacity当vector没有内存的时候 分配之前的两倍的内存 之后把之前的赋值过去 后来实验到应该是1/2
一、首先,看看vector的内存分配机制:
int
main()
{
vector
<
A
> v;
A
a1(1);
int
tNowCa;
int
num=1;
for
(
int
i=0;i<200;i++){
v.push_back(a1);
if
(i==0){tNowCa=v.capacity();
continue
;}
if
(tNowCa!=v.capacity()){
printf(
"%d\n"
,tNowCa);
tNowCa=v.capacity();
}
}
}
1
2
3
4
6
9
13
19
28
42
63
94
141
每次扩容都是增加当前空间的50%(第一次除外);
网上的代码GCC的vector
- if (_Capacity < size() + _Count)//当前空间不足,需要扩容
- { // not enough room, reallocate
- _Capacity = max_size() - _Capacity / 2 < _Capacity
- ? 0 : _Capacity + _Capacity / 2; // try to grow by 50%,扩容50%
- if (_Capacity < size() + _Count)//扩容50%后依然不够容下,则使容量等于当前数据个数加上新增数据个数
二、构造函数的调用
int
Anum=64;
class
A
{
public
:
int
a;
A()
{
a=++Anum;
printf(
"编号%c构造函数\n"
,a);
}
A(
const
A
&
a
)
{
this
->a=++Anum;
printf(
"编号%c复制构造函数\n"
,
this
->a);
}
~A()
{
printf(
"编号%c析构函数\n"
,a);
}
};
int
main()
{
vector
<
A
> v;
A
a1;
v.push_back(a1);
printf(
"现在v的capacity是%d size是%d\n"
,v.capacity(),v.size());
v.push_back(a1);
printf(
"现在v的capacity是%d size是%d\n"
,v.capacity(),v.size());
}
分析一下:
代码:A
a1;
调用构造函数输出:
编号A构造函数
代码:
v.push_back(a1);
v开始的capacity和size都为0 现在push之后空间不够 去开空间1大小
调用赋值构造函数 所以输出:
编号B复制构造函数
push之后:输出:
现在v的capacity是1 size是1
代码:
v.push_back(a1);
v的capacity和size都为1 现在push之后空间不够 去开空间2大小
编号C复制构造函数
之后B会析构掉 因为之前的空间要删除
编号B析构函数
然后把要push进来的调用赋值构造函数来构建 放进新开的空间
编号D复制构造函数
程序结束
调用vectore的析构函数 之后删除空间 调用空间存储的对象的析构函数
编号A析构函数
编号C析构函数
编号D析构函数
编号C析构函数
编号D析构函数
三、如何使用提高性能:
为了比较,我们用了三种方式来把100个数据存入vector中,分别是:1、直接每次push_back();2、使用resize()提前分配100个空间,然后push_back;3、使用reserve提前分配100个存储空间。
速度(快到慢):3>2>1
【注】:reserve分配空间 resize()会调用构造函数
时间:2014.10.14.
04:28:20
作息不太正常 = =
看了这篇博客加上自己实践:http://blog.csdn.net/mfcing/article/details/8746256