C++知识点

您所在的位置:网站首页 python中reserve=true C++知识点

C++知识点

#C++知识点| 来源: 网络整理| 查看: 265

参考: 1)https://blog.csdn.net/sinat_38183777/article/details/82056289 2)https://blog.csdn.net/manonggou/article/details/106097630 3)https://blog.csdn.net/qq_37037492/article/details/86568290

下面内容引用于参考1)

1 reserve的优势

函数原型:

/** *@function 申请n个元素的内存空间 *@param n 元素个数 */ void reserve (size_type n);

"vector函数的作用就是申请内存空间,vector是一种可以自动扩展的容器,也就是可以根据元素个数自动申请内存,那么有什么必要去主动为它申请内存空间呢?答案是有必要的,我们来看个例子。假如要使用vector存储1000个数据:

方式1:vector vec, 然后调用1000次 vec.push_back(); 方式2:vector vec,然后调用vec.reserve(1000)申请1000个元素的内存,再调用1000次 vec.push_back();

方式1要进行若干次内存分配;而方式2只需要进行1次内存分配。其效率立见高下,所以在需要对大量数据进行处理的时候,使用reserve主动分配内存可以提升程序执行效率。"

2 异常处理

“我们在使用这个函数的时候,如果申请的内存比较大的话就需要注意,如果处理不当程序很可能会出现崩溃。例如点云数据很容易上百万级,需要的内存就比较大了。

我们查看reserve这个函数,资料说它能传入的最大数据是max_size,等于1073741823,当传入的参数比它大时就会抛出一个 length_error异常。这是一个很大的数,我们可以简单的做一个计算,如果存储的数据类型为int型,每个int数据占用4个字节,max_size个int数据就相当于4096GB。想想我们怎么也不可能申请这么大的内存,所以这个异常是极少出现的。但是我们传入远远小于max_size的参数时程序也会出现崩溃,这是为什么呢?这就是因为除了这个异常,还有另一个异常也会导致程序出错。

内存的分配不只受到reserve函数参数的限制,更受到电脑总内存的限制,一般的电脑内存也就4GB、8GB,操作系统、应用程序执行也需要一部分内存,剩下的内存才是能够给reserve分配的。然后我们认为操作系统和应用程序大概也就用2GB的内存吧,那还剩下至少2GB的内存,我不申请2GB,我申请1GB总行吧,但是结果很令人沮丧,程序出现异常。我做了一个实验,申请的内存大概到200MB的时候就有一定概率出现异常。我的理解是vector的内存是连续的,电脑中虽然还剩下比较多的内存,但是连续的内存却只有几百MB,所以最多只能申请那么多内存,多了就会失败。你已经看出来了,这个异常就是bad_alloc,分配内存失败。

reserve这个函数是能抛出异常的,如果我们没有去捕获这个异常,那么程序运行到这里就直接崩溃了,加上异常捕获就能避免这个问题,只要输出异常信息或在软件界面上给出用户提示信息就可以了。另一个就是要尽量限制传入参数的值,减少出现异常的情况。

所以一定要对异常处理有一个清晰的认识,有时候软件崩溃或许就是因为你没有对能抛出异常的函数进行异常处理,而这些问题又不算真正的bug,让你陷入错误的解决道路中。所以一条有用的定律就是凡是有异常抛出的函数都加上异常处理。”

3 reverse和resize区别

以下内容引用于参考2) “一、resize 1、resize(n) 调整容器的长度大小,使其能容纳n个元素。 如果n小于容器的当前的size,则删除多出来的元素。否则,添加采用值初始化的元素。 2、 resize(n,t) 多一个参数t,将所有新添加的元素初始化为t。

二、reserve reserver()的用法只有一种:reserve(n) 预分配n个元素的存储空间。

size(长度):指容器当前拥有的元素个数; capacity(容量):则指容器在必须分配新存储空间之前可以存储的元素总数,也可以说是预分配存储空间的大小。

容器调用resize()函数后,所有的空间都已经初始化了,所以可以直接访问。而reserve()函数预分配出的空间没有被初始化,所以不可访问。 1)resize()函数对vector的影响。 size:调用resize(n)后,vector的size即为n,且其中元素都为0。 capacity:取决于调整后的容器的size是否大于capacity。如果调整后size大于capacity,则capacity调整为size大小,否则不变

2)reserve()函数对vector影响 capacity:调用reserve(n)后,若容器的capacity=n呢?capacity无变化。” 例子:

vector a; a.reserve(100); a.resize(50); cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3