-
当向vector插入元素时,若超出了
end_of_storage
,
①计算所需新内存大小len,通过allocate
分配len;
②调用insert_aux
另找一块2倍大小的新内存,拷贝插入点之前的数,插入新值,拷贝插入点之后的数
③destory
(根据元素类型是否有trivial的dtoc
来选择决定调用dtor析构元素还是什么也不做)并deallocate
旧内存
④调整start,finish,end_of_storage
⑤在扩容过程中,遵循commit or rollback:即要么成功产生所有元素,要么不产生任何元素。一旦分配内存过程中发生异常,uninitialized_copy,uninitialized_fill,uninitialized_fill-n
等全局函数负责析构已经产生的所有元素 -
分配内存的时间开销跟大小无关,只跟分配次数有关;
因此当知道vector所需n个元素大小空间,就该在初始化的时候指定大小,这样会调用allocate_and_fill
一次性分配够,因此开销只有1次分配内存;而初始化为空时,就会在每次push_back
或insert
操作时不断的扩容,总的开销为log n次分配内存 + n次拷贝;
①1,2,4…共需扩容log n次,相比1次很费时间
②每次扩容都需copy
旧元素,log n次扩容,共copy1+2+4+8+…大概n个元素,平摊大概一个元素需要拷贝一次;
vector的扩容机制
最新推荐文章于 2024-06-25 20:40:54 发布