STL中vector内存分配策略剖析
相关背景知识:
size是vector当前所包含的元素个数
capacity是vector当前可以使用的容量,capacity大于等于size
reserve是设置vector的容量
实验代码如下:
#include <vector>
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
int main(int argc,char **argv)
{
vector<int> ivec;
for(int i = 0;i<100;++i)
{
ivec.push_back(i);
cout<<" size="<<ivec.size()<<" capacity="<<ivec.capacity();
if(i % 3 == 2)
cout<<endl;
}
return 0;
}
实验结果:
size=1 capacity=1 size=2 capacity=2 size=3 capacity=4
size=4 capacity=4 size=5 capacity=8 size=6 capacity=8
size=7 capacity=8 size=8 capacity=8 size=9 capacity=16
size=10 capacity=16 size=11 capacity=16 size=12 capacity=16
size=13 capacity=16 size=14 capacity=16 size=15 capacity=16
size=16 capacity=16 size=17 capacity=32 size=18 capacity=32
size=19 capacity=32 size=20 capacity=32 size=21 capacity=32
size=22 capacity=32 size=23 capacity=32 size=24 capacity=32
size=25 capacity=32 size=26 capacity=32 size=27 capacity=32
size=28 capacity=32 size=29 capacity=32 size=30 capacity=32
size=31 capacity=32 size=32 capacity=32 size=33 capacity=64
size=34 capacity=64 size=35 capacity=64 size=36 capacity=64
size=37 capacity=64 size=38 capacity=64 size=39 capacity=64
size=40 capacity=64 size=41 capacity=64 size=42 capacity=64
size=43 capacity=64 size=44 capacity=64 size=45 capacity=64
size=46 capacity=64 size=47 capacity=64 size=48 capacity=64
size=49 capacity=64 size=50 capacity=64 size=51 capacity=64
size=52 capacity=64 size=53 capacity=64 size=54 capacity=64
size=55 capacity=64 size=56 capacity=64 size=57 capacity=64
size=58 capacity=64 size=59 capacity=64 size=60 capacity=64
size=61 capacity=64 size=62 capacity=64 size=63 capacity=64
size=64 capacity=64 size=65 capacity=128 size=66 capacity=128
size=67 capacity=128 size=68 capacity=128 size=69 capacity=128
size=70 capacity=128 size=71 capacity=128 size=72 capacity=128
size=73 capacity=128 size=74 capacity=128 size=75 capacity=128
size=76 capacity=128 size=77 capacity=128 size=78 capacity=128
size=79 capacity=128 size=80 capacity=128 size=81 capacity=128
size=82 capacity=128 size=83 capacity=128 size=84 capacity=128
size=85 capacity=128 size=86 capacity=128 size=87 capacity=128
size=88 capacity=128 size=89 capacity=128 size=90 capacity=128
size=91 capacity=128 size=92 capacity=128 size=93 capacity=128
size=94 capacity=128 size=95 capacity=128 size=96 capacity=128
size=97 capacity=128 size=98 capacity=128 size=99 capacity=128
size=100 capacity=128
结果解析:
当vector需要分配新的内存空间的时候,分配的容量capacity是当前size的2倍,如果当前为空,则默认分配的容量capacity为1,可能有人认为容量capacity大小是2的指数倍,如上面的实验程序capacity分别为1、2、4、8、16、32、64、128,其实不然,我们再看下面的例子:
#include <vector>
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
int main(int argc,char **argv)
{
vector<int> ivec;
ivec.reserve(3);
for(int i = 0;i<50;++i)
{
ivec.push_back(i);
cout<<" size="<<ivec.size()<<" capacity="<<ivec.capacity();
if(i % 3 == 2)
cout<<endl;
}
return 0;
}
实验结果:
size=1 capacity=3 size=2 capacity=3 size=3 capacity=3
size=4 capacity=6 size=5 capacity=6 size=6 capacity=6
size=7 capacity=12 size=8 capacity=12 size=9 capacity=12
size=10 capacity=12 size=11 capacity=12 size=12 capacity=12
size=13 capacity=24 size=14 capacity=24 size=15 capacity=24
size=16 capacity=24 size=17 capacity=24 size=18 capacity=24
size=19 capacity=24 size=20 capacity=24 size=21 capacity=24
size=22 capacity=24 size=23 capacity=24 size=24 capacity=24
size=25 capacity=48 size=26 capacity=48 size=27 capacity=48
size=28 capacity=48 size=29 capacity=48 size=30 capacity=48
size=31 capacity=48 size=32 capacity=48 size=33 capacity=48
size=34 capacity=48 size=35 capacity=48 size=36 capacity=48
size=37 capacity=48 size=38 capacity=48 size=39 capacity=48
size=40 capacity=48 size=41 capacity=48 size=42 capacity=48
size=43 capacity=48 size=44 capacity=48 size=45 capacity=48
size=46 capacity=48 size=47 capacity=48 size=48 capacity=48
size=49 capacity=96 size=50 capacity=96
由上面两个例子的结果可以看出vector的内存分配策略:当vector需要分配内存的时候,分配的大小是当前size的2倍,这样在使用vector的随机访问优势的时候,内存分配的负面影响也会降到最低(不然每次要重新申请内存和复制元素,效率低下)
至此,vector的内存分配策略已呈现在各位面前,谢谢观看!
相关背景知识:
size是vector当前所包含的元素个数
capacity是vector当前可以使用的容量,capacity大于等于size
reserve是设置vector的容量
实验代码如下:
#include <vector>
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
int main(int argc,char **argv)
{
vector<int> ivec;
for(int i = 0;i<100;++i)
{
ivec.push_back(i);
cout<<" size="<<ivec.size()<<" capacity="<<ivec.capacity();
if(i % 3 == 2)
cout<<endl;
}
return 0;
}
实验结果:
size=1 capacity=1 size=2 capacity=2 size=3 capacity=4
size=4 capacity=4 size=5 capacity=8 size=6 capacity=8
size=7 capacity=8 size=8 capacity=8 size=9 capacity=16
size=10 capacity=16 size=11 capacity=16 size=12 capacity=16
size=13 capacity=16 size=14 capacity=16 size=15 capacity=16
size=16 capacity=16 size=17 capacity=32 size=18 capacity=32
size=19 capacity=32 size=20 capacity=32 size=21 capacity=32
size=22 capacity=32 size=23 capacity=32 size=24 capacity=32
size=25 capacity=32 size=26 capacity=32 size=27 capacity=32
size=28 capacity=32 size=29 capacity=32 size=30 capacity=32
size=31 capacity=32 size=32 capacity=32 size=33 capacity=64
size=34 capacity=64 size=35 capacity=64 size=36 capacity=64
size=37 capacity=64 size=38 capacity=64 size=39 capacity=64
size=40 capacity=64 size=41 capacity=64 size=42 capacity=64
size=43 capacity=64 size=44 capacity=64 size=45 capacity=64
size=46 capacity=64 size=47 capacity=64 size=48 capacity=64
size=49 capacity=64 size=50 capacity=64 size=51 capacity=64
size=52 capacity=64 size=53 capacity=64 size=54 capacity=64
size=55 capacity=64 size=56 capacity=64 size=57 capacity=64
size=58 capacity=64 size=59 capacity=64 size=60 capacity=64
size=61 capacity=64 size=62 capacity=64 size=63 capacity=64
size=64 capacity=64 size=65 capacity=128 size=66 capacity=128
size=67 capacity=128 size=68 capacity=128 size=69 capacity=128
size=70 capacity=128 size=71 capacity=128 size=72 capacity=128
size=73 capacity=128 size=74 capacity=128 size=75 capacity=128
size=76 capacity=128 size=77 capacity=128 size=78 capacity=128
size=79 capacity=128 size=80 capacity=128 size=81 capacity=128
size=82 capacity=128 size=83 capacity=128 size=84 capacity=128
size=85 capacity=128 size=86 capacity=128 size=87 capacity=128
size=88 capacity=128 size=89 capacity=128 size=90 capacity=128
size=91 capacity=128 size=92 capacity=128 size=93 capacity=128
size=94 capacity=128 size=95 capacity=128 size=96 capacity=128
size=97 capacity=128 size=98 capacity=128 size=99 capacity=128
size=100 capacity=128
结果解析:
当vector需要分配新的内存空间的时候,分配的容量capacity是当前size的2倍,如果当前为空,则默认分配的容量capacity为1,可能有人认为容量capacity大小是2的指数倍,如上面的实验程序capacity分别为1、2、4、8、16、32、64、128,其实不然,我们再看下面的例子:
#include <vector>
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
int main(int argc,char **argv)
{
vector<int> ivec;
ivec.reserve(3);
for(int i = 0;i<50;++i)
{
ivec.push_back(i);
cout<<" size="<<ivec.size()<<" capacity="<<ivec.capacity();
if(i % 3 == 2)
cout<<endl;
}
return 0;
}
实验结果:
size=1 capacity=3 size=2 capacity=3 size=3 capacity=3
size=4 capacity=6 size=5 capacity=6 size=6 capacity=6
size=7 capacity=12 size=8 capacity=12 size=9 capacity=12
size=10 capacity=12 size=11 capacity=12 size=12 capacity=12
size=13 capacity=24 size=14 capacity=24 size=15 capacity=24
size=16 capacity=24 size=17 capacity=24 size=18 capacity=24
size=19 capacity=24 size=20 capacity=24 size=21 capacity=24
size=22 capacity=24 size=23 capacity=24 size=24 capacity=24
size=25 capacity=48 size=26 capacity=48 size=27 capacity=48
size=28 capacity=48 size=29 capacity=48 size=30 capacity=48
size=31 capacity=48 size=32 capacity=48 size=33 capacity=48
size=34 capacity=48 size=35 capacity=48 size=36 capacity=48
size=37 capacity=48 size=38 capacity=48 size=39 capacity=48
size=40 capacity=48 size=41 capacity=48 size=42 capacity=48
size=43 capacity=48 size=44 capacity=48 size=45 capacity=48
size=46 capacity=48 size=47 capacity=48 size=48 capacity=48
size=49 capacity=96 size=50 capacity=96
由上面两个例子的结果可以看出vector的内存分配策略:当vector需要分配内存的时候,分配的大小是当前size的2倍,这样在使用vector的随机访问优势的时候,内存分配的负面影响也会降到最低(不然每次要重新申请内存和复制元素,效率低下)
至此,vector的内存分配策略已呈现在各位面前,谢谢观看!