嵌入式基础知识(C++)

本文详细阐述了C++编程中voliate关键字确保线程可见性的重要性,讨论了静态变量与自动变量的区别,以及堆栈内存管理和内存泄露、溢出的概念。还介绍了fork、exec和wait在进程间通信中的角色,以及map和unordered_map的不同用途,最后涉及了优先队列的定义和比较函数的使用。
摘要由CSDN通过智能技术生成

voliate关键字作用

  1. 保证了这个变量再不同线程的可见性,一个线程修改了它,另一个线程立马知道
  2. 禁止指令重排序

CPU会在缓存中读写数据,那么加了voliate关键字之后:

  1. 会将结果值立马写入主存
  2. 使其他线程对应变量的缓存无效,所以需要再次去主存中读取

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是定义优先队列中元素的比较方式的类。这个需要着重解释。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值