voliate关键字作用
- 保证了这个变量再不同线程的可见性,一个线程修改了它,另一个线程立马知道
- 禁止指令重排序
CPU会在缓存中读写数据,那么加了voliate关键字之后:
- 会将结果值立马写入主存
- 使其他线程对应变量的缓存无效,所以需要再次去主存中读取
static
被static声明的变量和函数只能在当前文件使用。
只初始化一次,因为静态变量保存在内存中,生命周期长,而自动变量保存在栈,函数调用结束就销毁。
堆和栈
栈空间由操作系统自动分配/释放
堆空间手动分配和释放
内存泄漏与溢出
1.内存泄露(memory leak):
申请完了内存用完了不释放,比如说一共有1024M的内存,分片了512M的内存一直不回收,那么可以用的内存只有512M了,仿佛泄露掉了一部分;
通俗一点讲,内存泄露就是 占着茅坑不拉屎
2.内存溢出(out of memory)
申请内存时,没有足够的内存可以使用;
就好比一个餐厅三张桌子,有两组游客吃完饭不走(内存泄露),剩下最后一张桌子,餐厅表示接待压力很大,这个时候一下子来了两组游客吃饭,此时只有一张桌子了,内存泄露就变成了内存溢出了.
内存泄露和内存溢出的关系:
内存泄露的增多了,最终会导致内存溢出.
fork、exec、wait
fork()
pid_t fork(void);
函数的作用:用于创建子进程。
包含头文件:
#include <sys/types.h>
#include <unistd.h>
返回值:
fork()的返回值会返回两次。一次是在父进程中,一次是在子进程中。
在父进程中返回创建的子进程的ID,
在子进程中返回0
在父进程中返回-1,表示创建子进程失败,并且设置errno
exec()
子进程中执行别的程序
wait():
用在父进程中等待子进程结束后,回收子进程,解除阻塞;若子进程一直没有退出,则阻塞住父进程。
Map unordered_map
map元素有序,性能较为稳定。适用于元素要求有序、或者对单次查询时间较为敏感,必须保持查询性能的稳定性,比如实时应用。
unordered_map查询速度快O(1),但是元素无序、查询性能不稳定(最坏为O(n))。适用于要求查询速率快,对单次查询性能要求不敏感。
总结:在需要元素有序性或者对单次查询性能要求较为敏感时使用map,其余情况下应使用unordered_map。进行算法编程的大部分情况下,都需要使用unordered_map而不是map。
Map
map会以键从小到大的顺序自动排序
#include<iostram>
#include<map>
using namespace std;
int main()
{
map<char,int> mp;
mp['m']=20;
mp['r']=30;
mp['a']=40;
for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++)//使用iterator 进行迭代
cout<<it->first<<' '<<it->second<<endl;
return 0;
}
//输出时,map会以键从小到大的顺序自动排序
a 40
m 20
r 30
mp.find(key) //返回键为key的映射的迭代器
mp.erase(it) //it为需要删除的元素的迭代器
//例子
map<char,int>::iterator it=mp.find('b');
mp.erase(it);
mp.erase(key) //key为欲删除的映射的键
mp.erase(first,last)
mp.size() //获取mp中映射的对数
mp.clear() //用来清空m中的所有元素
unordered_map
find() 查找与指定键匹配的元素。
end() 刚超出序列末尾的位置
begin() 指定受控序列或存储桶的开头。
clear() 删除所有元素。
count(key) 查找与指定键匹配的元素数。
empty() 测试元素是否存在。
size() 对元素数进行计数。
移除指定位置处的元素。
iterator erase(const_iterator Where);
iterator erase(const_iterator First, const_iterator Last);
size_type erase(const key_type& Key);
for (Mymap::const_iterator it = c1.begin();it != c1.end(); ++it)
cout << " [" << it->first << ", " << it->second << "]";
优先队列
定义容器和比较函数:然后,你需要定义一个priority_queue
对象,并指定元素类型和可选的比较函数(默认为std::less
)。
std::priority_queue<int, std::vector<int>, std::less<int>> pq;
默认情况下,priority_queue
使用std::less
作为比较函数,即元素的优先级按照从大到小的顺序排列。如果需要按照从小到大的顺序排列,可以使用std::greater
作为比较函数。
template <class T, class Container = vector<T>,class Compare = less<typename Container::value_type> >class priority_queue;
class T:T是优先队列中存储的元素的类型。
class Container = vector<T>:Container是优先队列底层使用的存储结构,可以看出来,默认采用vector。
class Compare = less<typename Container::value_type> :Compar是定义优先队列中元素的比较方式的类。这个需要着重解释。