2018.8.8笔记

void print(int a[2], int n){//OK,数组退化为指针

}

void print(int a[0], int n){//错

}

数据类型的本质:固定内存大小块的别名

const vector<int>::iterator iter
*iter = 10;
vector<int>::const_iterator iter
iter++

1,const static float cfx = 30
2,void func() const{}
3,函数重载
void func() const{}
void func(){}
void func(int x){}
void func(const int x){}//这个不是重载,编译报错,函数已存在

2018.8.8
程序生成过程:
预编译-处理#相关的,包括#include
编译-将源文件编译成汇编代码
汇编-将汇编代码一一对应的翻译成机器码,生成obj文件
每个生成的obj文件都包含了: 代码段,数据段等,见如下obj文件格式
链接-将obj拼接起来,去掉多余信息,生成可行文件
由于每个obj中都有代码段,数据段等,因此链接过程中要进行合并

obj与exe格式几乎相同,有一些链接信息:如动态链接库信息等

obj文件格式:
文件头
.data 数据段 可读可写
.text 代码段 只读
.rodata 只读数据段 const 等
.bss 未初始化的全局变量记录段(并不占物理内存,占虚拟空间)
.debug 调试信息
.dynamic 动态链接库信息
.symtab 符号表,就是程序中用到的变量的名字,局部的及全局的,编译器生成的,如段名等
链接报错时,错误信息大概就是这个符号表的东西吧
.其它


为什么要将代码段与数据段独立开?
1,代码是只读的,数据是可写的,必须分开
2,多个实例使用的代码,不同的数据
3,局部访问性原理,可提高缓存命中率

动态链接与静态链接
静态链接:此时静态库就像一个obj文件一样被缝合进了EXE
试想若每个程序都把系统的库静态链接入自己中,N个程序将复制N份系统库,运行时将重复大量的内存
而动态链接库则是共享库只加载一份到内存中,各程序共同使用它。
因为每个进程都有自己的虚拟空间,这个空间就是CPU的寻址范围,32位CPU,寻址能力是4GB,
就是说32位CPU上,每个进程的虚拟内存都是4GB
那么,由于动态链接库不是缝合到EXE中的,因此也不能映射到EXE的进程中,
故,动态链接库加载到内存中时也是有独立的虚拟空间的,
这就引出了一个著名问题:跨链接库 NEW/DELETE的问题,
在一个DLL中用NEW申请内存,在另一个DLL或EXE中 DELETE释放内存可能会出现问题,

计算机存储分类:
1,寄存器: CPU内的器件,速度最快的存储器
2,RAM: random access memory,由触发器矩阵组成,每8个为一组,构成一个字节
触发器由电容构成,上电表示1,无电表示0,因此RAM即内存断电数据丢失
2.1 dram : 动态RAM,就是常说的内存,因为需要定时刷新(上电),故称为动态内存
2.2 sram : 静态RAM, 就是常说的cache,因为它不需要刷新(上电),因此速度比内存更快
3,ROM: 只读存储器
4,磁盘,也称硬盘,它真是与磁有关:在金属表层涂上磁层来存储信息
磁道非常细小,肉眼不可见,一个盘片有上万个磁道。
多个盘片组成一个圆柱结构,构成磁盘
磁盘是靠转动配合磁头移动来定位并读写数据的,显然这种机械运动比内存的电信号速度差太多了

猜你喜欢

转载自www.cnblogs.com/timeObjserver/p/9444526.html