在我们学习的过程中,尤其是初学者,很多知识点都只知道一个概念,没有深究过其意义,也很少在实际开发中使用,过段时间就会疑忘,等到面试的时候被问到又头大的一比,最近在重新学习一个新的开发平台,树莓派和香橙派,分别用到了全职H616开发板和瑞芯微RV1126,都是ARM架构的,相当于回顾了一遍知识,也对曾经一知半解的知识点有了更深入的了解,在此篇将会总结一些容易被忽略的小知识点,更为重要的知识点将会单独写一篇来总结,此篇未完待续,持续更新
软链接和硬链接
软链接:ln -s 源文件绝对路径 目标链接文件绝对路径
软链接相当于快捷方式,文件本身存储的是源文件的绝对路径,所以源文件重命名或者路径被修改,软链接就失效了,软链接文件的内存大小是绝对路径的字符数量,软链接不受磁盘分区的限制且可以软链接目录。
硬链接:ln 源文件 目标链接文件
硬链接相当于对文件的备份,删除源文件,链接文件不会失效,他受磁盘分区的限制,只可以在同一磁盘或分区进行硬链接,只可以链接文件不可以链接目录。
static关键字
①修饰局部变量:延长生命周期为整个程序运行的时间(变量由栈区---->静态区),但作用域还是在函数内部,他只会被初始化一次,再一次调用这个函数的时会保留变量的上一次值,一般用于跟踪累计值。
②修饰全局变量和函数:限制为只能在本文件使用,可以避免命名冲突的问题。
volatile关键字(超级重要且难也很不起眼)
被volatile修饰的变量在进行存取操作的时候不会被编译器优化,也就是告诉编译器在对变量进行存取操作的时候直接使用变量内存的值而不是寄存器的备份,就比如说 变量c在赋值给变量a后又要赋值给变量b,底层实现步骤就是
①变量c内存中的值先给到cpu寄存器,②再将寄存器中的值给到变量b的,
③变量c内存中的值先给到cpu寄存器(编译器会将这一步给优化掉),④再将寄存器中的值给到变量a,如果c的值在赋值过程中是不变的,那么这样做确实可以优化来提升效率,那如果变量c的值是随时改变的,编译器就不应该做这种优化,此时就可以使用volatile关键词来修饰
应用场景:中断,多线程,读取硬件寄存器的值等变量值在频繁变化的场景
GCC编译流程和常用选项
- 预处理:gcc -E 1.c -o 1.i 将头文件包含进来并进行宏替换
- 编译:gcc -S 1.i -o 1.s 检查代码规范和语法错误
- 汇编:gcc -c 1.s -o 1.o 将汇编代码转换为机器代码
- 链接:gcc 1.o -o 1 将目标文件和库文件链接起来,生成可执行文件
常用选项:
- gcc -L:添加库文件所在的路径
- gcc -l(小写L): 链接制定的库名称
- gcc -I:添加头文件所在路径
内存泄漏
如何追踪内存泄漏
实习的时候会面对大型代码库,找文件是一个非常头疼的是,可以使用命令快速查找
find命令
find 路径 )-name "文件名"
find
如果没有指定路径,默认会在当前目录下进行搜索,如果完全不知道文件在哪个路径,可以使用sudo find / 在整个文件系统中查找
grep命令
grep -r "name" 路径
r表示递归遍历