首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Vector shrink 请求容器降低其容量和size匹配 shrink_to_fit();

resize(),设置大小(size); reserve(),设置容量(capacity); size()是分配容器的内存大小,而capacity()只是设置容器容量大小,但并没有真正分配内存。 打个比方:买了一个新房子,新房子里可以放3张床reserve(3),这是说房子的容量是最多放3张床,但是屋里并不是有三张床,二resize(3),房里安装了3张床,此时房里的床可以使用了。 reserve为容器预留足够的空间,避免不必要的重复分配,分配空间大于等于函数的参数,影响capacity。但reserve的功能确实蹩脚,只能用reserve是的capacity变得比之前大。 resize调整容器中有效数据区域的尺寸,如果尺寸变小,原来数据多余的截掉。若尺寸变大,不够的数据用该函数第二个参数填充,影响size。 由于vector是顺序容器,在内存中分配了一块连续的存储空间。为了保证动态添加元素的高效率,因此必须预先为vector分配一段空间,这个空间就是capacity。 而容器中元素的个数就是size(),在容器中,capacity总是大于等于 size; 当vector数组插入数据量过大时,其capacity,会变得很大,且清空vector容器后,还会保留原分配的容量capacity。系统不会自动收回空间吗?真的不会!!!! 我们一点一点写程序把risize()跟reserve()弄那个明白。

02

Netty中ByteBuf的copy、duplicate、slice方法对比「建议收藏」

duplicate和copye这两个方法都属于浅拷贝它和原buffer是共享数据的。所以说调用这些方法消耗是很低的, 并没有开辟新的空间去存储,但是修改后会影响原buffer。这就会导致一个问题:在源ByteBuf调用release() 之后, 一旦引用计数为零,就变得不能访问了;在这种场景下,源ByteBuf的所有浅层复制实例也不能进行读写了;如果强行对浅层复制实例进行读写,则会报错。因此,在调用浅层复制实例时,可以通过调用一次retain() 方法来增加引用,表示它们对应的底层内存多了一次引用,引用计数为2。在浅层复制实例用完后,需要调用两次release()方法,将引用计数减一,这样就不影响源ByteBuf的内存释放。

01
领券