IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 内存管理,宏函数 -> 正文阅读

[C++知识库]内存管理,宏函数

1、硬件(静态存储) VS 内存(动态存储)

2、为什么所有的编程都关注内存管理?--- 内存属于稀缺资源

3、编程过程中,内存管理主要做什么?---(防止内存泄露)

4、如何防止内存泄露?(用户自己管理、系统管理(GC:垃圾回收机制))

用户自己管理:缺点:对用户的要求比较高(良好编码习惯,经验值)

? ? ? ? ? ? ? ? ? ? ? 优点:开销小,实时性高

系统管理(GC:垃圾回收机制):优点:能够有效的防止内存泄露

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 缺点:开销大,实时性差,用户无法干预

5、C语言防止内存泄露方法:1、养成良好的编码习惯2、内存区域的划分(Linux虚拟地址空间)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3、动态分配内存的方式选择
6、检测内存泄露

内存池:(将使用多次malloc操作改变成只使用1次)
malloc/free是一个开销非常大的操作

预处理

1、预处理主要任务:? 头文件展开 宏替换 条件编译

2、头文件展开 : #include<> VS #include""

<>:包含系统定义的头文件(/usr/include),搜索路径:/usr/include系统的头文件目录;

"":包含自定义de头文件,搜索路径:先在当前目录查找,再到系统的头文件目录查找;

gcc -l指定头文件第三方搜索路径;

3、宏替换:

A\宏语法:#define NAME Value
B\替换逻辑:傻瓜式式替换 注意事项:使用()解决运算符优先级的题? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? C\?作用:定义常量(杜绝幻数)提高代码可读性? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 定义函数(宏函数):(用编译时间换内存空间)(用空间运行换时间:inline:修饰函数 c99支持 内嵌函数---把函数体的语句嵌到调用的语句? ?修饰的函数不能超过5行,不能存在全局变量,静态变量,不是任何函数都需要内嵌

面试题 自定义函数VS宏函数

自定义函数浪费运行时间;宏函数浪费编译时间

自定义函数占用空间因为要给形参分配空间浪费运行时间

宏函数只做傻瓜式替换浪费编译时间不占用内存空间

常用的宏函数

#和##

#的功能是将其后面的宏参数进行字符串化操作
##:连接 被称为连接符(Concatenator),用来将两个宏连接为一个 宏。注意这里连接的对象是宏就行,而不一定是宏的变量。

?内置宏介绍_LINE__? ? _func__? _DATE__? _TIME__(自定义宏不要用_开头,容易与内置宏产生冲突

条件编译:按照给定的条件编译代码(只影响编译不影响运行)
-D:向源文件中定义宏-D宏的名字(宏一定要大写)
条件编译应用场景:1、注释代码2、debug_msg

?

?调试用 debug_msg 正常输出用printf

关键词

register????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????register使用:只能修饰变量,不能修饰函数? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?尽可能的将数据保存到CPU的寄存器中,提高程序的执行效率(省去了CPU通过总线从内存中抓取数据的时间) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???????????????????????????????????????????????寄存器有可能保存到CPU的内部寄存器中,省去CPU从内存中获取数据的时间,从而提高程序运行效率;
? ?CPU三大组成部分:运算器 控制器 存储器(寄存器)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??使用场景:频繁访问的变量用register修饰可以起到优化程序运行效率的效果
??使用注意事项:1、不能通过取地址(&)来获取register修饰变量的地址;2、register修饰的变量类型一定是CPU所能处理的类型;

static

static:既能修饰局部变量,也能修饰全局变量,还能修饰函数;
修饰局部变置(静态数据区):延长局部变量的且命周期直至整个程序结束之后再释放? ? ? ? ? ? ? ? ? ? ? ? 修饰全局变量:限定作用域,只能在本文件访问,不能在其他文件访问;
修饰函数:限定作用域,只能在文件访问,不能在其他文件访问;
static的使用场景:
局部变量场景:替代全局变量(全局变量危险)
全局变量和函数:多人协作开发时,防止命名冲突;(全局变量名、函数名)
?

static在什么情况下使用?
(1)设置变量的存储域,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值; ? ?

(2)限制变量的作用域,在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问; ? ?

(3)限制函数的作用域,在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内; ? ?

(4)在类中的static成员变量意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见; ? ?

(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

extern

extern外部声明? 在当前文件中访问其他文件定义的全局变量或者函数:

const

const:修饰变量(局部、全局)????修饰变量,该变量成为一个只读变量(值是可以改变的)? ? ? ? ? ? ? ?const修饰变量:只读变量,对应的内存空间是可变的,但是不能通过变量名来修饰
const离谁近,谁就不能被修改

使用注意事项:修饰某个变量时,一定要初始化

使用场景:修饰函数的形参,提供安全访问接口函数,防止函数实现过程中修改实参变量的值

typedef

typedef:给数据类型重命名
作用:提高的移植性,可读性,编写效率;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

typedef VS #define? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #define 不能定义复杂的类型(函数指针变量),typedef可以? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #define 预处理阶段做傻瓜式替换,存在风险(不做语法检查),不安全;

为什么要使用typedef给类型重命名?

一是表明该类型的特殊作用,

二是将来有可能要改变这种类型(比如提高精度)

三是简化代码,便于批量修改具体类型。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

#define VS const? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?定义常量? define更好 const定义的是局部变量? ? ? define在预处理阶段不做语法检查 所以不安全存在风险,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

????????????????????????????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? inline

inline:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?重复包含 ? ? ?---解决方法在头文件加? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-29 16:08:07  更:2021-11-29 16:10:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:24:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码