嵌入式开发内存节约方法(笔记)

2023-05-16

1. 不要在.h文件中定义变量,可以声明一个extern全局变量,定义在某一个.c文件中进行。其他.c文件即可共用。 

在源文件中引入头文件相当于直接把头文件的内容拷贝到原文件中,如果引入这个头文件后,将会在每个引入的源文件中重复定义这些变量。在C++中这样的代码是可以编译通过的,但是在C语言编译器中是不能编译通过的。

如果在头文件中定义static变量,在多个源文件中引入是可以编译通过的,因为相当于在每个源文件中定义了一个static变量,而static变量的作用域限定在这个源文件内的。
  如果在头文件中定义了const变量,在多个源文件中引入是不能编译通过的,因为const没有限定作用域,每个文件都定义这个变量,会出现重复定义的错误。

不要直接在头文件中定义const或static变量,更好的写法是在源文件中定义,在头文件中extern声明。例如:

// defs.h
extern const std::string kStr;
extern const Student kStu;
// defs.cpp
const std::string kStr = "String";
const Student kStu("Name");

2. 尽量用结构体Union

3. 分时复用

4. 位域

5. 常量用const定义,会存放道flash中而不是RAM中;宏定义常量编译期间不占内存,但每次引用会分配内存。

const  可以节省空间,避免不必要的内存分配。 例如: 
        #define PI 3.14159 //常量宏 
        const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ...... 
        double i=Pi; //此时为Pi分配内存,以后不再分配! 
        double I=PI; //编译期间进行宏替换,分配内存 
        double j=Pi; //没有内存分配 
        double J=PI; //再进行宏替换,又一次分配内存! 
        const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝(因为是全局的只读变量,存在静态区),而 #define定义的常量在内存中有若干个拷贝。
 

Static 与 Extern:

函数内部的定义的变量,只在函数内部存在,函数外部定义的变量分为extern 和static,extern全局变量在整个项目均可调用,static只在本文件.c/.h文件有效。

变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。

静态static限定了函数或变量的存在范围为本文件,extern则表明为整个项目均存在。

static一旦定义变量,则该变量就会存在于整个文件范围内,不会消失。其真实作用域取决于定义的位置,若在函数外部,则整个文件可见可用;若定义在某一函数内部,则仅此函数文件可见可用,但在整个文件范围内存在,因此在此调用此函数,会保留上次结果;此功能仅对本函数可见,外部其他函数不可见。若无static,每次调用结束后该变量会消失。

static unsigned int temp2 = 0;/*修饰全局变量,作用域在整个a.c中*/

static void fun1(void)
{
    static unsigned int temp1 = 0;
    temp1++;
    temp2++;
    temp2++;
    printf("fun1_temp =  %d,temp2 =  %d\r\n",temp1,temp2);
    temp++;
}

static void fun2(void)
{
    static unsigned int temp1 = 0;
    temp2++;
    printf("fun2_temp1 =  %d,temp2 =  %d\r\n",temp1,temp2);
}

int main(int argc, _TCHAR* argv[])
{
    fun1();
    fun2();
    fun1();
    fun2();
    return 0;
}


输出结果如下:
fun1_temp = 1,temp2 = 2;
fun2_temp = 0,temp2 = 3;
fun1_temp = 2,temp2 = 5;
fun2_temp = 0,temp2 = 6;
 

指针:

int a = 100;
int *p_a = &a;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式开发内存节约方法(笔记) 的相关文章

  • ubuntu远程桌面

    xff08 一 xff09 可视化界面远程访问Linux服务器 这里以Ubuntu为例 xff0c 最常见的是通过xrdp和vnc这两种远程桌面协议来进行可视化远程操作 1 关于xrdp协议和vnc协议之间区别 参考自 xff1a http
  • 针对Linux 错误make: *** No rule to make target ` ‘, needed by xxx. Stop. (webots调试出现这个错误,原因相同)

    导致出现make No rule to make target 96 needed by xxx Stop 的主要原因就是因为Makefile出现问题 xff0c 编写Makefile的时候多加了空格 括号等原因导致报这个错误 具体的参考实
  • eigen库的安装与基本使用教程

    Eigen是可以用来进行线性代数 矩阵 向量操作等运算的C 43 43 库 xff0c 它里面包含了很多算法 在用C 43 43 写运动控制算法 xff08 例如MPC控制算法 xff09 的时候 由于算法包括矩阵运算 xff0c c 43
  • CMakeLists.txt的简单学习教程汇总

    最近因为要编辑一个T265的例程 xff0c 但是里面的CMakeLists中的含义自己不明白 xff0c 在网上搜集了一些资料 xff0c 对自己学习进行一下总结也是让需要的人更加明白清楚 学习这个的最好的方式是自己理解了以后 xff0c
  • LEGION联想Y7000P Ubuntu18.04的无线网卡驱动安装

    安装无线网卡的驱动的第一步大家应该弄清楚自己的无线网卡型号 建议最好的方式是在Windows下面确定类型 xff0c 在设备管理器中查看对应的无线适配器型号 xff0c 在下载对应的驱动 在Ubuntu下面也可以通过指令进行查看但是看不到具
  • 向量点乘(即内积)和叉乘(即外积、向量积)区别与意义分析

    向量之间的叉乘和点乘 xff0c 概念易混淆 xff0c 分别不清楚 xff0c 因此本文专门对这个概念进行了详细分析介绍 首先 xff0c 介绍一下向量 xff08 Vector xff09 xff0c 在几乎所有的几何问题中 xff0c
  • MATLAB图中加入阴影

    在绘制MATLAB 图时 xff0c 想表示不同的阶段 xff0c 所以将其中一部分用阴影颜色强调出来 xff0c 因此进行了一下绘制图像的知识补充 其中想要的效果是类似于下面这张 xff1a 具体如何实现呢 xff0c 有两种方式 xff
  • Matlab调整子图位置及大小

    为了绘制多个子图的MATLAB图 xff0c 但是使用导出设置时无法将子图全屏铺满整个屏幕 xff0c 因此本文对设置MATLAB子图位置进行了研究 xff0c 达到如下的效果 1 首先 xff0c 明确其中每个变量的含义 xff0c 从M
  • excel计算出均方根值(RMS)+ 均方根误差(RMSE)+标准差(Standard Deviation)

    首先弄明白这几者的区别 xff0c 方差 标准差和均方根误差的区别总结 均方根值 xff08 RMS xff09 43 均方根误差 xff08 RMSE xff09 43 标准差 xff08 Standard Deviation xff09
  • Matlab画图和点标记

    从csv中导出数据 xff0c 然后需要在MATLAB图中进行标记个别点 xff0c 但是利用MTALB自身标记的比较丑 xff0c 因此搜了一下别的方法 xff0c 具体效果如下 xff0c 其中的 可以改成O或者其他的自定义的符号 xf
  • word因导入mathtype不能使用复制粘贴快捷键的解决方法

    经查阅有两种解决方式 xff1a 1 直接删除你安装的原office中的MathType Commands 2016 dotm这个文件 2 是更换为mathtype里面的文件 xff0c 具体过程如下两个参考 xff1a 官网给出的解决办法
  • 强力推荐90个优秀外国英文网站

    一 大陆可访问的优秀英文信息源 1 英国 经济学家 http www economist com 2 美联社 http wire ap org GoToAP cgi 3 英国BBC http news bbc co uk 4 纽约时报 ht
  • 学习笔记(01):MFC上位机与STM32下位机通讯精讲-STM32串口实战1之串口发送1(串口初始化实践)...

    立即学习 https edu csdn net course play 6375 122556 1 GPIO PinAFConfig 函数复用功能 xff0c 将GPIO和USART连接起来
  • 单片机模拟输出PPM信号

    PPM信号就是将多个PWM信号放在一起传输 xff0c 一个PPM的周期为20ms 其中一个通道信号的范围为1 2ms 所以一个PPM信号 xff0c 最多可以传输10个通道的PWM信号 PPM信号以0 5ms的低电平信号代表一个通道的起始
  • linux在线模拟器

    我们项目部在开发过程中运用了自动化发布系统 xff0c 而且发布过程比较严格和规范 xff0c 写完代码只需要提交svn xff0c 填写发布文档 xff0c 测试通过之后有运维组发布到线上 这就导致很少有接触linux系统的机会 xff0
  • ROS订阅者程序

    include lt ros ros h gt include lt turtlesim Pose h gt include lt iomanip gt void poseMessageReceived const turtlesim Po
  • 吴恩达 ML作业提交:Grader sent no response

    目录 文章目录 目录前言正文解决方案 前言 最近在补习吴恩达machinelearning 的课程 xff0c 上完了课 xff0c 肯定是要做作业的 xff0c 做作业没有问题 xff0c 但在提交作业时遇到了问题 xff0c 记录如下
  • Docker容器通过独立IP暴露给局域网的方法

    Docker容器非常轻量 xff0c 系统开销非常少 xff0c 比VMware或者VirtualBox用起来方便 xff0c 部署起来也非常容易 官方推荐我们通过端口映射的方式把Docker容器的服务提供给宿主机或者局域网其他容器使用 一
  • CCS v6.1下完成TI-RTOS配置

    TI RTOS 是实时操作系统的TI微控制器 TI RTOS实现更快的发展不再需要开发人员编写和维护的系统软件 xff0c 如调度程序 xff0c 协议栈和驱动程序 它结合了实时多任务内核与其他中间件组件 xff0c 包括TCP IP和US
  • 【USRPx310系列(NI USRP2940-2955)+ srsRAN】环境搭建与应用

    x1f4e3 x1f973 x1f973 x1f973 x1f4e3 Hello 如果这篇 文章 对你有帮助 x1f604 xff0c 希望可以给博主点个赞 x1f44d 鼓励一下 x1f618 x1f4e3 x1f973 x1f973 x

随机推荐