vector内存分配简单介绍
众所周知,vector的size()其实并不代表它占用的空间,它实际占用空间可以用capacity()查看
众所周知,push_back()时,如果size==capacity则会使capacity从0变1或者变为原来两倍,当然如果size<capacity则不会触发内存分配
众(gui)所(cai)周(zhi)知(dao),一旦触发内存分配,原来的指针或者迭代器失效,因为vector的所有内容搬迁到新的内存里了
你可能觉得push_back()奇慢无比,那倒也不至于,因为平均下来push_back()复杂度确实是 \(O(1)\)
当然慢也是有一定道理的,因为如果直接用vector数组作为邻接表来存图,效率并不理想
比如我们定义了 vector<int> a[100010];,随机建边的时候就会疯狂触发内存分配导致愉快地tle(不过图论题这么毒瘤的也不常见)
解决方法是前向星或者手写分配器。如果不手写分配器用list替代vector貌似更慢了(虽然我也不知道为什么,另外forward_list和vector差不多的亚子)
众(gui)所(cai)周(zhi)知(dao),不止push_back(),像resize(),reserve()等都会触发内存分配
众(gui)所(cai)周(zhi)知(dao),像clear(),pop_back()等并不会释放内存(也就不会使capacity变小),只有shrink_to_fit()等少数几个操作才能使capacity变小。因此有些不得已的情况会用a=vector<int>()来代替a.clear()
当然也有可能a.clear()导致mle,a=vector<int>()导致tle(笑)
众(gui)所(cai)周(zhi)知(dao),vector对内存分配的惰性其实是为了效率考虑的,它很好地规避了频繁的分配释放空间。vector满足了很多常见需求。但是像图论等某些地方还是不能偷懒,还得花点功夫写分配器,或者用前向星、手写queue这种朴素方法代替stl
手写分配器的方法如下:
static char space[10000000],*sp=space;
template<typename T>
struct allc:allocator<T>{
allc(){}
template<typename U>
allc(const allc<U> &a){}
template<typename U>
allc<T>& operator=(const allc<U> &a){return *this;}
template<typename U>
struct rebind{typedef allc<U> other;};
inline T* allocate(size_t n){
T *res=(T*)sp;
sp+=n*sizeof(T);
return res;
}
inline void deallocate(T* p,size_t n){}
};
vector< int,allc<int> > a;
vector内存分配简单介绍的更多相关文章
- GC之一--GC 的算法分析、垃圾收集器、内存分配策略介绍
一.概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本 ...
- Java内存分析简单介绍
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11904422.html Java内存分析简单介绍: 1. # 设置内存溢出时自动生成堆内存快照 ...
- C++ STL vector 内存分配
vector为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储. 当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间.拷贝元素.撤销 ...
- C++的STL中vector内存分配方法的简单探索
STL中vector什么时候会自动分配内存,又是怎么分配的呢? 环境:Linux CentOS 5.2 1.代码 #include <vector> #include <stdio ...
- vector内存分配
vector,map 这些容器还是在堆上分配的内存,在析构时是释放空间 vector在提高性能可以先reserve在push_back() reserve:决定capacity,但没有真正的分配内存, ...
- java类中属性的加载顺序,以及内存分配情况介绍
看下面例子及说明: /** 假如有外部类调用了该类,代码为:new StaticTest(); 那么下面是类属性的加载顺序 */ public class StaticTest{ public int ...
- Linux环境编程之共享内存区(一):共享内存区简单介绍
共享内存区是可用IPC形式中最快的.一旦内存区映射到共享它的进程的地址空间,进程间数据的传递就不再涉及内核.然而往该共享内存区存放信息或从中取走信息的进程间通常须要某种形式的同步.不再涉及内核是指:进 ...
- vector的内存分配与释放
1. vector内存分配 <Effective STL>中"条款14":使用reserve来避免不必要的重新分配 关于STL容器,最神奇的事情之一是只要不超过它们的最 ...
- (转)C++ STL中的vector的内存分配与释放
C++ STL中的vector的内存分配与释放http://www.cnblogs.com/biyeymyhjob/archive/2012/09/12/2674004.html 1.vector的内 ...
随机推荐
- 小米重新上锁[BL]
解锁一时爽,bug火葬场.废话不多说,直接上教程. 首先安装 线刷工具:http://bigota.d.miui.com/tools/MiFlash2018-5-28-0.zip 解锁工具:http: ...
- 14、 NAT
私有IP地址段:10.0.0.0-10.255.255.255/8172.16.0.0-172.31.255.255/12192.168.0.0-192.168.255.255/16 NAT的必要性: ...
- Netty学习(1):IO模型之BIO
概述 Netty其实就是一个异步的.基于事件驱动的框架,其作用是用来开发高性能.高可靠的IO程序. 因此下面就让我们从Java的IO模型来逐步深入学习Netty. IO模型 IO模型简单来说,就是采用 ...
- LUA学习笔记(第5-6章)
x = a or b 如果a为真则x = a 如果a为假则x = b print(a .. b) 任何非nil类型都会被连接为字符串,输出 多重返回值 local s,e = string.find( ...
- Vmware初次安装虚拟机需要做的一些网络配置——nat模式与桥接模式
一.本机设置: 1.首先点击图中红线区域: 2.点击网络适配器 3.会出现如下区域: 4.网卡开启后设置ip地址,此处设置的ip和本机的ip没有关系,设置成你虚拟机里面运行的计算机需要的ip地址网段 ...
- python 函数(实参与形参、传递参数)
函数 什么是函数?函数是带名字的代码块,用于完成具体的工作.写出一个函数后,就可以一直调用. 定义函数,函数的基本组成: 1.1 向函数传递参数 向函数中传递任意参数,这样打印出的结果就可以根据自己的 ...
- Cheat Sheet pyspark RDD(PySpark 速查表)
- CCF_201604-3_路径解析
没有用stack来写,直接用了字符串和指针,过程有点复杂的.首先对读入的每一个路径,判断它是绝对路径或者相对路径,然后确定起始的路径,然后继续一位位的判断,"//","/ ...
- 题解 bzoj1954【Pku3764 The xor – longest Path】
做该题之前,至少要先会做这道题. 记 \(d[u]\) 表示 \(1\) 到 \(u\) 简单路径的异或和,该数组可以通过一次遍历求得. \(~\) 考虑 \(u\) 到 \(v\) 简单路径的异或和 ...
- The related functions and attributes for managing attributes - 操作属性的重要属性和函数
特性 property 都是类属性(静态变量),但是特性管理的其实是实例属性的存取, ****** 回顾 -'类方法' classmethod 和 '静态方法' staticmethod 皆可以访问类 ...