当前位置: 首页 > news >正文

汉中做网站的电话中国站长

汉中做网站的电话,中国站长,图片制作视频教程,成都网站建设制作价格vector是一个封装了动态大小数组的顺序容器,它能够存放各种类型的对象。 可以删除元素、可以插入元素、可以查找元素,做这些工作我们无需管理容器内存。容器内存管理,这种脏活累活全部交由vector管理。了解一下vector的内存管理策略,能够更加充分的利用内存。 1 vector内存…

vector是一个封装了动态大小数组的顺序容器,它能够存放各种类型的对象。 可以删除元素、可以插入元素、可以查找元素,做这些工作我们无需管理容器内存。容器内存管理,这种脏活累活全部交由vector管理。了解一下vector的内存管理策略,能够更加充分的利用内存。

1 vector内存分配策略

1.1 vector扩大容量的本质

vector 的大小和容量相等(size==capacity)也就是满载时,如果再向其添加元素,那么 vector 就需要扩容。vector 容器扩容的过程需要经历以下 3 步:

  • 完全弃用现有的内存空间,重新申请更大的内存空间;
  • 将旧内存空间中的数据,按原有顺序移动到新的内存空间中;
  • 最后将旧的内存空间释放。

这也就解释了,为什么 vector 容器在进行扩容后,与其相关的指针、引用以及迭代器可能会失效的原因。

1.2 vector使用示例

通过一个vector简单示例,看看vector是如何管理内存的。
程序1

#include <iostream>
#include <vector>class MyClass {
public:MyClass() {++contruct_cnt;std::cout << this << ": MyClass constructor called " << contruct_cnt << " times" << std::endl;}~MyClass() {++deconstrcut_cnt;std::cout << this << ": MyClass deconstrcut called " << deconstrcut_cnt << " times" << std::endl;}MyClass(const MyClass &tmp) {++copy_construct_cnt;std::cout << this << ": MyClass copy_constructor called " << copy_construct_cnt << " times"  << "copy from " << &tmp << std::endl;} 
private: static int contruct_cnt;static int deconstrcut_cnt;static int copy_construct_cnt;     
};int MyClass::contruct_cnt = 0;
int MyClass::deconstrcut_cnt = 0;
int MyClass::copy_construct_cnt = 0;  void VectorTest1()
{MyClass a, b, c, d, e;std::vector<MyClass> myVector;std::cout << std::endl << "======a======" << std::endl;myVector.push_back(a);std::cout << "vector capacity is " << myVector.capacity() << std::endl;std::cout << "vector size is "<< myVector.size() << std::endl;std::cout << std::endl <<"======b======" << std::endl;myVector.push_back(b);std::cout << "vector capacity is " << myVector.capacity() << std::endl;std::cout << "vector size is "<< myVector.size() << std::endl;std::cout << std::endl << "=======c=====" << std::endl;myVector.push_back(c);std::cout << "vector capacity is " << myVector.capacity() << std::endl;std::cout << "vector size is "<< myVector.size() << std::endl;std::cout << std::endl << "=======d=====" << std::endl;myVector.push_back(d);std::cout << "vector capacity is " << myVector.capacity() << std::endl;std::cout << "vector size is "<< myVector.size() << std::endl;std::cout << std::endl << "========e====" << std::endl;myVector.push_back(e);    std::cout << "vector capacity is " << myVector.capacity() << std::endl;std::cout << "vector size is "<< myVector.size() << std::endl;// 当myVector离开作用域时,它的析构函数会被调用,从而调用每个元素的析构函数
}int main() {VectorTest1();return 0;
}

执行输出结果如下:

ThinkPad-P15v-Gen-2i:~/work/ybb$ ./a.out 
0x7ffd8b07403b: MyClass constructor called 1 times
0x7ffd8b07403c: MyClass constructor called 2 times
0x7ffd8b07403d: MyClass constructor called 3 times
0x7ffd8b07403e: MyClass constructor called 4 times
0x7ffd8b07403f: MyClass constructor called 5 times======a======
0x55c2cb9282c0: MyClass copy_constructor called 1 timescopy from 0x7ffd8b07403b
vector capacity is 1
vector size is 1======b======
0x55c2cb9282e1: MyClass copy_constructor called 2 timescopy from 0x7ffd8b07403c
0x55c2cb9282e0: MyClass copy_constructor called 3 timescopy from 0x55c2cb9282c0
0x55c2cb9282c0: MyClass deconstrcut called 1 times
vector capacity is 2
vector size is 2=======c=====
0x55c2cb9282c2: MyClass copy_constructor called 4 timescopy from 0x7ffd8b07403d
0x55c2cb9282c0: MyClass copy_constructor called 5 timescopy from 0x55c2cb9282e0
0x55c2cb9282c1: MyClass copy_constructor called 6 timescopy from 0x55c2cb9282e1
0x55c2cb9282e0: MyClass deconstrcut called 2 times
0x55c2cb9282e1: MyClass deconstrcut called 3 times
vector capacity is 4
vector size is 3=======d=====
0x55c2cb9282c3: MyClass copy_constructor called 7 timescopy from 0x7ffd8b07403e
vector capacity is 4
vector size is 4========e====
0x55c2cb9282e4: MyClass copy_constructor called 8 timescopy from 0x7ffd8b07403f
0x55c2cb9282e0: MyClass copy_constructor called 9 timescopy from 0x55c2cb9282c0
0x55c2cb9282e1: MyClass copy_constructor called 10 timescopy from 0x55c2cb9282c1
0x55c2cb9282e2: MyClass copy_constructor called 11 timescopy from 0x55c2cb9282c2
0x55c2cb9282e3: MyClass copy_constructor called 12 timescopy from 0x55c2cb9282c3
0x55c2cb9282c0: MyClass deconstrcut called 4 times
0x55c2cb9282c1: MyClass deconstrcut called 5 times
0x55c2cb9282c2: MyClass deconstrcut called 6 times
0x55c2cb9282c3: MyClass deconstrcut called 7 times
vector capacity is 8
vector size is 5
0x55c2cb9282e0: MyClass deconstrcut called 8 times
0x55c2cb9282e1: MyClass deconstrcut called 9 times
0x55c2cb9282e2: MyClass deconstrcut called 10 times
0x55c2cb9282e3: MyClass deconstrcut called 11 times
0x55c2cb9282e4: MyClass deconstrcut called 12 times
0x7ffd8b07403f: MyClass deconstrcut called 13 times
0x7ffd8b07403e: MyClass deconstrcut called 14 times
0x7ffd8b07403d: MyClass deconstrcut called 15 times
0x7ffd8b07403c: MyClass deconstrcut called 16 times
0x7ffd8b07403b: MyClass deconstrcut called 17 times

上面的代码,加了很多打印,可以很好的分析程序执行的情况,这里主要说一下myVector在析构的时候,要调用存放在vector中元素的析构,再释放myVector占用的空间。
同时可以看到在填充vector的时候,会发生大量的拷贝构造,造成资源浪费,下面给出一个极端示例展示Vector在push_back时调用的拷贝构造函数次数。

程序2

#include <iostream>
#include <vector>class MyClass {
public:MyClass() {++contru
http://www.fp688.cn/news/155483.html

相关文章:

  • 番禺做网站系统seo搜索引擎优化人才
  • 莆田有哪几家做网站设计的企业公司网站建设
  • 站长工具seo综合查询方法无锡百度竞价公司
  • 做微网站的公司哪家好呢软文外链代发
  • 外贸网站seo怎么做石家庄百度搜索引擎优化
  • 丽水网站建设最稳定的灰色词排名
  • 淮北市建设局网站今日新闻头条新闻
  • 惠安县道安办网站建设精准营销通俗来说是什么
  • 佛山禅城区网站建设公司优化方法
  • 中山做网站公司关键词优化顾问
  • 公司网站建设全怎么做推广网络
  • 辽宁建设工程信息网审计报告如何优化标题关键词
  • 专业沈阳网站制作首页百度
  • 计算机二级网页设计考什么企业网站优化的三层含义
  • 中山网站建设方案百度网址怎么输入?
  • 三桥做网站北京关键词seo
  • 企业网站建设需要提供什么内容南京seo外包
  • 大连模板网站制作价格拼多多seo是什么意思
  • 北京网站制作到诺然电话号码宣传广告
  • 有关做聚合物电池公司的网站手游推广加盟
  • ppt做的好的网站有哪些东莞网站制作推广公司
  • 化妆品网站建设可行性分析南宁seo排名外包
  • 专业做网站上海成都全网营销推广
  • 企业网站后台管理软件全网营销一站式推广
  • 哈尔滨网站设计定制软文推广有哪些平台
  • 贵阳网站建设-中国互联好口碑关键词优化地址
  • 网站建设有哪些问题成都外贸seo
  • 怎么做粉丝福利购网站企业网络推广的方法
  • 免费网站建站页面宁波网站制作设计
  • wordpress文章前端按钮青岛建站seo公司