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++知识库 -> 21-11-26内存管理 -> 正文阅读

[C++知识库]21-11-26内存管理

编程:实现删除字符串中出现次数最少的字符:
main.c

//统计每个字符在字符串中出现的次数
//统计次数找出最小数
//删除指定字符串
#include <stdio.h>
#define max_size 1024
int main(int argc,**argv)
{
    if(argc != 2)
    {
        printf("please input string!\n");
        exit(1);
    }
    int count[26] = {0}//'a' - 'z'
    char src[max_size];
    strcpy(src,argv[1]);

    couont_ch(src,count);
    return 0;
}

count_ch.h

void count_ch(char *s, int *count);

count_ch.c

void count_ch(char *s, int *count)
{
    while(*s != '\0') //"abcd"
    {
        count[*s - 'a']++;
        s++;
    }
}

1、硬盘(静态存储) VS 内存区别(动态存储)
./hello(hello从硬盘加载到内存中)
2、为什么所有的编程语言都关注内存管理?(内存属于稀缺资源)
3、编程过程中,内存管理主要做什么?(防止内存泄露)
4、如何防止内存泄漏?
用户自己管理:
缺点:对用户要求比较高(良好编码习惯,经验值)
优点:开销少、实时性高
系统管理(GC:垃圾回收机制):
优点:能够有效的防止内存泄漏
缺点:开销大,实时性差,用户无法干预
5、c语言防止内存泄漏方法:
1、养成良好编码习惯
2、内存区域的划分(Linux虚拟地址空间)
3、动态分配内存的方式选择
在这里插入图片描述

6、检测内存泄漏:
valgrind --tool=memcheck --leak-check=full./test

预处理
1、预处理主要任务:
头文件展开
宏替换
条件编译
2、头文件展开:#include <> VS #include “”
<>:包含系统定义的头文件(/usr/include),搜索路径:/usr/include 系统的头文件目录
“”:包含自定义的头文件,搜索路径:先在当前目录查找,再到系统的头文件目录查找;
gcc -I 制定头文件第三方搜索路径;
3、宏替换:
宏语法:#define NAME Value
替换逻辑:傻瓜式替换注意事项:使用()解决运算符优先级的问题
作用:
定义常量(杜绝幻数)提高代码可读性
定义函数(宏函数):
![在这里插入图片描述](https://img-blog.csdnimg.cn/0d46fb41224a4ba8a95636c6684b8933.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5ZWl5Lmf5a2m5LiN5Lya55qE6I-c6bih,size_15,color_FFFFFF,t_70,g_se,x_1在这里插入图片描述宏函数:频繁使用且短小的函数,最好优化成宏函数(不安全:复杂函数)
面试题:宏函数 VS 自定义函数的区别
定义函数(宏函数)(用编译时间换内存空间)(用空间换运行时间:inline:修饰函数:不超过5行,不能有全局变量、静态变量 内嵌函数)

6)宏的使用注意
1、#:#的功能是将后面的宏参数进行字符串化操作
2、##:连接
内置宏介绍 LINE func DATE TIME
printf("%s,%s,%s,%d,DATE,TIME,func,LINE);在这里插入图片描述
条件编译:按照给定的条件编译代码(只影响编译不影响运行)

#if 0
#endif

在这里插入图片描述
-D:向源文件中定义宏 -D宏的名字(大写)

条件编译应用场景:1、注释代码 2、debug_msg在这里插入图片描述
3、防止头文件重复包含

关键字:
register:只能修饰变量,不能修饰函数,也不能修饰全局变量
寄存器变量:有可能保存到CPU的内部寄存器中,省去cpu从内存中获取数据的时间,从而提高程序运行效率
使用场景:频繁访问的变量用register修饰可以起到优化程序运行效率的效果
使用注意事项:
1、不能通过&来获取register修饰变量的地址
2、register修饰的变量类型一定是cpu所能处理的类型

volatile:
变量前面加上volatile,防止优化:告诉编译器,该变量随时可能改变
使用场景:修饰全局变量
一般说来,volatile用在如下的几个地方:
中断服务程序中修改的供其它程序检测的变量需要加 volatile;
多任务环境下各任务间共享的标志应该加 volatile;
存储器映射的硬件寄存器通常也要加 volatile 说明,因为每次对它的读写都可能由不同意义;

static:
既能修饰局部变量又能修饰全局变量还能修饰函数
修饰局部变量(静态数据区):延长局部变量的生命周期直到整个程序结束之后再释放
修饰全局变量:限定作用域,只能在本文件访问,不能在其他文件访问
修饰函数:限定作用域,只能在本文件访问,不能在其他文件访问
extern:外部声明,在当前文件中访问其他文件定义的全局变量或者函数
static使用场景:
局部变量场景:替代全局变量(全局变量危险)
全局变量和函数:多人协作开发时,防止命名冲突;(全局变量名、函数名)
const:
修饰变量(局部、全局)
const修饰变量:只读变量:对应的内存空间是可变的,但是不能通过变量名修改
const距离谁近,谁就不能变请添加图片描述

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

typedef:
给数据类型重命名
使用场景:修饰函数形参,提供安全访问接口函数,防止函数实现过程中修改实参变量的值
作用:提高移植性,可读性,编写效率
重命名函数指针
在这里插入图片描述

#typedef VS #define
#define不能定义复杂的类型(函数指针变量),typedef可以

inline关键字:
参考https://www.cnblogs.com/cthon/p/9152464.html

  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:08:17 
 
开发: 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 10:00:10-

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