Programming Tips [关于编程的有用提示]
这里总结了关于计算机编程的一些有用的提示和计算机程序的一些原理。笔者认为非常有用。
-
计算机多层存储的原因是由于CPU的一次计算时间和硬盘读写数据的时间之间的巨大差距,比如CPU一次计算只需要1ns,而机械硬盘传输100MB的数据可能需要1s左右,而在这1s左右,CPU只能等待[如果没有其他人物可做]。所以在CPU和硬盘之间,还有内存Memory和缓存Cache,当然缓存中也有L1-L3,从内存到L1缓存,容量逐渐变小但读写入读逐渐变快,这样可以将经常使用的数据存到内存或者缓存中,这样CPU可以快速获取从而提高系统处理的整体性能
-
在C语言和IA-32的CPU这种典型场景下,函数和数据都是通过栈的数据结构来完成执行的[发生在CPU寄存器中,寄存器是CPU中集成的成容量很小但是有着和CPU处理器几乎一样的时钟周期的读写速度非常快的存储单元],本质上说程序和数据在CPU处理时都是以地址的形式存储和表达,而计算机处理程序和对应数据的过程,也就是不断寻址并读取其中的值进行操作。从这个角度,一个C语言函数其实本质就是一段连续的栈空间通过对应的栈顶指针和栈底指针来标志,空间中存储着局部变量和函数的返回地址[overflow攻击可以修改这个返回地址],一旦函数执行完毕,其中的局部变量就会因为栈顶指针和栈底指针的移动而失效,这也就是为什么局部变量出了作用域就无效的原因。
-
在C语言和IA-32的CPU这种典型场景下,迭代函数,随着迭代次数的增加而占用更多的空间,因为每次迭代都会使用一段新的栈空间[相当于函数再次执行了一次],所以如果过迭代次数,会有出现内存溢出的情况。
-
Byte和Bit之间的关系。Bit,发音类似比特,简写是b,是计算机操作系统和存储结构中最小的数据存储单位,一个bit的取值只能是0或者1[现代计算机是以二进制为基础的]。Byte[字节],发音类似拜特,一般由八个Bit组成,简写是B。Byte是计算机操作系统中最小的寻址单位,也就是说对于计算机软件来说,最小的可读取单位是Byte。我们所说的硬盘容量是40GB或者120GB,这里的B指是的byte。换算比如,
1 KB = 1024 bytes = 2^10 bytes, 1 MB = 1024 kb = 2^20 bytes, 1 GB = 1024 mb = 2^30 bytes
。同时我们一般说数据传输速率,例如网速或者usb2.0标准接口传输速率等等,指的是bit。比如mbps = mega bits per second[兆位/秒]是速率单位,所以正确的说法应该是说usb2.0的传输速度是480兆位/秒,即480mbps。 -
数组,多维数据,结构体,都是通过首地址加偏移量的方式来保存和访问其中的元素的,也就是说他们都是连续存储的,比如结构体中每个成员变量虽然名称不同类型不同,但是整个结构体是一块连续空间。对于这些数据结构,如果作为参数传递的话,一般是指针传递也就是传递其首地址,而不会进行值传递,因为如果是值传递,它们一定是传递到栈里面去。比如结构体里面的每一个成员都得传送到栈里面去。这样做效率很低空间占用率很高。
-
对于机器级代码,其实并不区分数据类型,比如int,float,有无符号等。也不区分程序和数据,都把他们看成01序列。
-
为了避免不同模块或者程序之间的冲突,或者引起一些想不到的错误[并且可能发现错误的时候,已经离错误的原点很远了],应尽量比描使用全局变量。在一定要使用的情况下,应该对全局变量添加static类型,来避免模块内引用出错[因为静态变量是放在全局区,而不是堆区或者栈区]。同时,全局变量应赋一个初值,使之成为强符号,便于发现错误。外部全局变量要使用extern关键字,用来表示其定义在其他模块。
-
一个由C/C++编译的程序占用的内存分为以下几个部分。栈区[stack]:由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。堆区[heap]:一般由程序员分配释放[比如malloc或者alloc函数],若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。全局区[静态区][static]:全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。文字常量区:常量字符串就是放在这里的。程序结束后由系统释放。程序代码区:存放函数体的二进制代码。