最近发现开机之后系统就会占用大量内存,16G的内存开机就占用了80%以上,而且system占用了大量cpu资源,找了很久的原因。昨晚找到一个解释是win10系统电源管理里的快速开机设置导致的,自己关掉这个设置后确实内存占用的问题解决了,system占用的问题也解决了,开机速度其实并没有什么影响。 但是还有个问题是一个Micosoft软件保护平台服务的进程也占用了大量cpu,目前还没找到合适的解决方法,以后有时间再看吧,目前问题不大。 不过每个人系统的问题都不大相同,原因是多种多样的,只能多看多试了。
笔记规范
一个计算语言的关注列表
C语言内存泄漏
这几天写一个求本征值的小程序,快疯了 一开始题目没理解 再就是分析了半天思路不清晰 终于理顺了下思路,在无量纲化上又卡住了 最后发现存在严重的内存泄露 真是该遇到的问题都遇到了
无量纲化
内存泄漏
C语言中如果在一个函数内使用了malloc等函数分配内存,如果在函数内不free(),函数结束后并不会将分配的内存自动释放(否则通过指针返回这段内存的值就不可能实现了),因此在调用函数后如果不释放这段内存(或者在另一个函数中调用一个返回指针的函数,或者左边的指针又被指向了别的内存,就会导致内存泄漏,尤其在大量函数调用中,会导致特别严重的内存泄漏)血的教训!!!
- 更改指针的值时一定要十分注意,其指向的内存是否以及被释放
- 调用一个返回指针(指向函数内一个内存块)的函数时绝对不能隐式调用,必须将其返回给一个指针,且在使用之后一定要释放
- 总的来说,调用一个返回指针的函数的释放内存的工作由调用函数完成。有多少个malloc就应该有多少个free。
4/20更新 突然发现以前对指针的理解有很大的误区,至少如果想调用函数后保存返回的数据,并不需要给接受数据的指针先malloc一块内存再将数据复制过去(实际上这样会导致复制之后被调函数返回的内存无法释放,除非再用别的方法在复制数据之后释放内存,但这样完全是在绕弯路,不仅效率低下,而且可能错误释放内存或者没有释放内存)。但有些情况下似乎确实需要先分配内存再复制的方式来进行(好像也有替代方案)。 无论如何,我现在的结论是C并不是特别适合用于计算除了所谓的效率之外,对于内存的管理,数组操作的缺少,以及缺少面向对象都让我在使用过程中感到沮丧,毕竟其一开始就不是为了数值计算设计的。 但是在现在以及入坑的状态下,只能先硬着头皮上了,虽然还有些问题,但是对C的理解确实在加深,希望后面遇到的坑尽量少一点吧。但是后面确实想换个工具了(Fortran,python,C++?)
- Fortran实在太丑了,虽然其确实提供了比较好的数组和并行工具,但是给我一种落后的感觉。
- python比较现代了,加上各种计算库和图形库,使用起来很舒服,但是作为一种解释型的语言,对于计算来说效率是个问题(虽然也没实际操作过)
- C++虽然提供了OOP,但是本质上也不是为了计算而设计的,而且看起来是个比C更大的坑
- C也许应该考虑使用一些已经有的计算库,避免重复造轮子,也更加有效率,同时也能学习一下(不过现在的基础还是要打好的) 所以以后可能混合使用吧,先用C或者Fortran实现一个玩具模型,再用C/C++实现实际应用工程。如果有一门专门面向计算的现代语言就好了
指针的坑
总而言之,现在学习计算的过程中,还是先用着C吧,毕竟时间也不够再换一个工具了 1. 指针初始声明之后是否需要分配内存 2. 分配的内存何时释放
4/21/0:14更新 内存泄漏终于解决了 >_< 真是快哭了,这一个星期都在解决这个该死的内存泄漏和VS对C支持问题 虽然后面还要解决算法的问题,但至少是可以看的见的了。
VS抽风
刚刚VS2017又不知道为什么抽风了,include的头文件结果调用的函数显示为定义或者一些奇怪的定义,前面定义的变量结果后面就成为定义的了 Google了下没找到问题解决方法 尝试修复一些VS 不行的话再去社区问下
虽然不太清楚原因,但是瞎鼓捣一通之后似乎修复了这个问题。就是将.c后缀改成.cpp后缀,然后再该回去也能识别了。 大概是VS对C的解析出现了问题,因为VS本身没有C项目,所有把C识别成了C++的项目?
还有对于git不太熟悉,本来想尝试还原到上一个版本,结果合并出一些奇怪的东西,甚至少了些(幸亏把源码备份了一份)不然真要哭了😭 大概应该找个项目练练git和GitHub的使用
基本确定就是VS把C和C++混淆了,但是现在不确定该怎么修复这个问题,似乎是因为之前加入的一小部分代码导致的,回退到之前的版本解决了问题,再重新加入添加的代码也能正确编译了。(谜之bug)。。。
算法图解——笔记
实现RK4
这几天写计算物理的作业,用C实现4阶Runge-Kutta时踩了很多坑,记录一下
指针
函数指针
函数返回指针
关键词 static
形参中声明一个返回指针的函数
相关函数
memset(),将一个数组初始化为给定值,<string.h> memcpy(),将一个数组的值复制到另一个数组<string.h> fabs(),用于浮点数的abs函数,<stdlib.h> clock(),返回时钟周期,配合clock_t结构使用,<time.h> 对C语言的标准库要熟悉一下,没必要重复造轮子 (话说写这些函数不都重复造轮子么Orz)
一些小问题
- 开始写程序之前一定要有规划,好的程序设计不应该有特别大的问题。将问题细化,到每一行
- 写注释,说明干了什么,怎么干的,为什么要这么赶,变量的意义
- 查找程序逻辑bug时,首先检查每一步实现是否有问题: > * 括号
- 参数是否正确
- 赋值两边变量是否正确,类型(浮点,整形,单精度)。函数的实参位置
- 表达式是否正确(有没有多或者漏一项)