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,磁盘,也称硬盘,它真是与磁有关:在金属表层涂上磁层来存储信息
磁道非常细小,肉眼不可见,一个盘片有上万个磁道。
多个盘片组成一个圆柱结构,构成磁盘
磁盘是靠转动配合磁头移动来定位并读写数据的,显然这种机械运动比内存的电信号速度差太多了
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 开发的设计和重构,为开发效率服务
· 从零开始开发一个 MCP Server!
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· Ai满嘴顺口溜,想考研?浪费我几个小时