C++嵌入式内存管理详情

 更新时间:2022年01月24日 16:51:20   作者:一个热爱学习的深度渣渣  
这篇文章主要介绍了C++嵌入式内存管理,是对上一篇内存的一个补充,主要讲解Linux中的内存;这部分对于一些端侧部署的伙伴来说比较重要,推荐针对不同的板子,下面来看看详细内容吧,需要的朋友可以参考一下

前言:

上一篇介绍了软件层面上的内存,并没有涉及很多底层的原理;但在实际工程中,部署一个项目往往需要考虑内存的占用,这里的内存也就是嵌入式板子上的内存;本篇文章就简单介绍一下嵌入式端的一个内存管理;

一、Linux内核系统结构

主要分为五大模块:

本次主要讲解内存管理模块,其他模块不做介绍;

二、查看Linux内存

在Linux环境下,可通过free -m查看内存使用情况;

下图是一台rk3326机器的内存情况:

在这里插入图片描述

  • Mem:表示物理内存统计;
  • total:表示物理内存总量(used + free);
  • used:表示总计分配给缓存(包含buffers与cache)使用的内存数量,但其中部分缓存并未实际使用;
  • free:未被分配的内存;
  • shared:内存共享;
  • buffers:系统分配但未被使用的buffers数量;
  • cached:系统分配但未被使用的cache数量;
  • -/+ buffers/cache:表示物理内存的缓存统计;
  • Swap:表示硬盘上交换分区的使用情况;

1.cache

cache的作用不同于buffer,它的速度极快,当进行底层优化的时,可能要编写基于cache的内存管理程序;它是直接与CPU交互的,不用走DDR;

思考以下哪种循环效率高:

// 第一种循环
int arr[10][100];

for (i = 0;, i < 10; i++)
 for (j = 0; j < 100; j++)
  arr[i][j] = 8;
  
// 第二种循环
for (i = 0; i <100; i++)
 for (j = 0; j < 10; j++)
  arr[j][i] = 8;

从硬件层面来看,第二种的效率最高,因为内存的跳转相对少了很多,所以我们需要注意在嵌套循环中,尽量把大的循环写在内层;

2.buffer

buffer是缓冲区,作用是开辟一块地址空间,可以将程序需要用到的内存空间先开辟好,有了buffer可以避免在快速读写时候的问题;

cache和buffer的一个区别:

  • cache:把读取过来的数据保存起来,重新读取时若命中,则不需要再去硬盘读取;其中的数据会根据读取频率进行筛选,把频繁读取的数据放在最容易找到的位置,把不在读取的数据往后排,直到删除,这也是LRU缓存算法的原理;
  • buffer:是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能;

三、内存补齐

在很多嵌入式板子上都有内存对齐的处理;

思考下以下结构占用的内存:

struct A{
 char a;  // 1
 char b;  // 1
 int c;  // 4
}

根据CPU的分配机制,在64位机器上占用8个字节,这也是做了一些对齐处理;

不仅仅是内存,一些板子(例如昇腾310)会对图像数据进行对齐,图像的分辨率要满足硬件支持的倍数,这样才能做到高效处理;

总结:

本篇只是对上一篇内存的一个补充,主要讲解Linux中的内存;这部分对于一些端侧部署的伙伴来说比较重要,推荐针对不同的板子,还是需要先阅读API文档,了解关于内存的API后再进行代码的开发;

到此这篇关于C++嵌入式内存管理详情的文章就介绍到这了,更多相关C++嵌入式内存管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ stringstream格式化输出输入详情

    C++ stringstream格式化输出输入详情

    这篇文章主要介绍了C++ stringstream格式化输出输入,首先string str; cin>>str;遇到空格结束;于是乎产生了getline(),可与得到一行字符串;空格自动去掉,下面来看看文章的详细内容,需要的小伙伴可以参考一下
    2021-11-11
  • C语言实现三子棋小游戏

    C语言实现三子棋小游戏

    这篇文章主要为大家详细介绍了C语言实现三子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C语言实现四窗口聊天

    C语言实现四窗口聊天

    这篇文章主要为大家详细介绍了C语言实现四窗口聊天,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • 一文带你学习C++析构函数

    一文带你学习C++析构函数

    在C++中,析构函数是一种特殊类型的成员函数,用于在对象生命周期结束时被自动调用,本文我们将介绍C++析构函数的一些重要知识点,并提供相应代码示例,需要的朋友可以参考下
    2023-05-05
  • C++使用opencv处理两张图片的帧差

    C++使用opencv处理两张图片的帧差

    这篇文章主要为大家详细介绍了C++使用opencv处理两张图片的帧差,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C++用easyx图形库实现障碍跑酷小游戏

    C++用easyx图形库实现障碍跑酷小游戏

    这篇文章主要为大家详细介绍了C++用easyx图形库实现障碍跑酷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • C++默认参数与函数重载及注意事项

    C++默认参数与函数重载及注意事项

    这篇文章主要介绍了C++默认参数与函数重载及注意事项包括语法与使用,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2020-03-03
  • C语言中函数返回字符串的方法汇总

    C语言中函数返回字符串的方法汇总

    C语言返回字符串函数共有四种方式,分别如下:使用堆空间,返回申请的堆地址,注意释放、函数参数传递指针,返回该指针、返回函数内定义的静态变量(共享)、返回全局变量
    2017-05-05
  • CFileDialog设置多选的问题解决

    CFileDialog设置多选的问题解决

    前几天同事问我在CFileDialog中多选时按确定按钮后DoModal函数的返回值是IDCANCEL的问题解决
    2013-02-02
  • c++ 面向对象设计五大原则

    c++ 面向对象设计五大原则

    这篇文章主要介绍了c++ 面向对象设计五大原则,帮助大家更好的理解和学习c++面向对象设计,感兴趣的朋友可以了解下
    2020-08-08

最新评论