1.注意函数的封装,尤其是参数的设计。
2.库属于第三方代码,需要包含头文件,在链接的时候会通过环境变量找到lib.o文件并包含进去。
3.尽量避免系统调用:即软硬件之间的切换。
4.main函数也是一个函数,只不过在编译的时候做了特殊的处理。
5.函数的名字就相当于是一个地址,相似的是汇编里的lable标号。
6.内存的使用:全局变量是在编译的时候就分配了。(这个有点难以理解)函数中的变量时在栈中分配的(因此函数调用结束的时候会自己消除)。而new等的动态奉陪是在堆上分配的。
7.parameter和argument的区别,一个是形式参数,一个是实参
8.函数返回的时候不仅会返回值,并且会隐含的返回一个地址,即汇编中的call ,和ret。返回到调用它的代码段中
9.函数参数的入栈顺序一般是从右向左,一般是。使用的时候就pop
10.栈是从高地址向低地址使用,而堆是从低地址向高地址使用(从两边到中间)
11.程序在内存中的存放顺寻:从低地址——》高地址为:
code 全局变量,常量。 堆: 栈 (大概如此,从汇编很好理解)
12. 调用一个函数的时候call会先将函数的地址push到栈中,以使用ret返回,然后修改eip(instruction pointer)指令指针。
13.函数返回值放在eax中,消除被调用函数的stackframe。pop esp
14.值传递:哪怕是指针,它也是值传递,只不过是相对于指针本身是值传递,但是指针指向的值是可以改变的。
15.int * & p;从右向左看,首先他是一个引用,然后是一个指针的引用,然后是一个int型的指针的引用。明白了
16.int func(int array[5]);在编译的时候当成是一个数组,或者一个整形指针,但不进行检查有多少个,可以传递三个的数组,当使用 array[5]的时候会造成内存的禁止访问,但当参数为int (&a)[5]的时候会强制要求是5的长度的。()不能少。
17.数组参数传递时会退化成一个指针。一个指针的长度一般为4Bytes。
18.32位机器的虚拟内存为4G。即程序使用的时候都认为自己拥有4G的空间。
19.程序放到内存中的时候,在高地址处的首部会有:程序名,环境变量,控制台参数
20.内存中的每个程序都见到自己的地址为0X08048000~0Xffffffff。但在物理内存中不一定了就,所以需要之间有一个转换工具,硬件实现。
(未完待续)