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++ 实现2048游戏示例

    C++ 实现2048游戏示例

    《2048》是比较流行的一款数字游戏。原版2048首先在github上发布,原作者是Gabriele Cirulli。它是基于《1024》和《小3传奇》的玩法开发而成的新型数字游戏。
    2014-06-06
  • C++20中的std::span详解

    C++20中的std::span详解

    span就是一个连续对象存储的观察者,类似std::string_view是string的观察者,这篇文章主要介绍了C++20 std::span,需要的朋友可以参考下
    2023-03-03
  • C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别

    C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别

    这篇文章主要介绍了C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别的相关资料,需要的朋友可以参考下
    2017-04-04
  • 关于C++菱形运算符深度解析

    关于C++菱形运算符深度解析

    从语言标准来说,c++里没有什么菱形运算符,c++20里虽然新增了一个运算符operator<=>,但这个和所谓的菱形运算符没有任何关系,下面通过本文探讨C++里也有菱形运算符吗这一问题探讨,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • 从头学习C语言之for语句和循环嵌套

    从头学习C语言之for语句和循环嵌套

    这篇文章主要为大家详细介绍了C语言之for语句和循环嵌套,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • C语言编程技巧 关于const和#define的区别心得

    C语言编程技巧 关于const和#define的区别心得

    尽量用const和inline而不用#define 这个条款最好称为:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分。这是问题之一。再看下面的语句:
    2013-02-02
  • C++深入浅出讲解隐藏this指针的用法

    C++深入浅出讲解隐藏this指针的用法

    在C++中,每一个对象都能通过this指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象
    2022-05-05
  • boost字符串处理函数format的用法

    boost字符串处理函数format的用法

    这篇文章介绍了boost字符串处理函数format的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C++ 在 Unreal 中为游戏增加实时音视频互动的教程详解

    C++ 在 Unreal 中为游戏增加实时音视频互动的教程详解

    这篇文章主要介绍了C++ 在 Unreal 中为游戏增加实时音视频互动的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • C语言使用libZPlay录制声音并写到文件的方法

    C语言使用libZPlay录制声音并写到文件的方法

    这篇文章主要介绍了C语言使用libZPlay录制声音并写到文件的方法,实例分析了C语言操作音频文件的相关技巧,需要的朋友可以参考下
    2015-06-06

最新评论