2025-05-13CSAPP瞎几把笔记
1 计算机系统漫游
一个程序的编译
1gcc hello.c -o hello
hello.c 预处理 hello.i 编译 hello.s 汇编 hello.o 链接 可执行文件
如何运行?
打开shell(命令解释),对第一词语不是内置命令,则认为其为可执行文件并加载
CPU处理器
PC 程序计数器,大小为一个字(32-bit: 4bytes;64-bit: 8bytes)CPU会执行PC所指向的命令
寄存器文件(Register file)包含若干个寄存器,单字长
ALU 计算功能
内存
从0开始的大数组,由随即动态存储器的芯片构成
Bus总线
传送字
控制器 适配器
在IO主线和IO设备之间传送数据
其他设备
磁盘、IO设备等等
Cache 高级缓存,为了弥补磁盘内存寄存器读取速度越来越慢造成的时间开销
操作系统的进程
上下文
线程 进程包括多个进程
进程的虚拟地址空间,从下到上
代码数据区,从文件直接读写在这个区域
例如全局变量
堆
例如malloc分配,可以动态的扩展
共享库
例如printf函数的库
栈
函数,不过是从高到低
内核保留的区域
...
详情 2025-03-19[C/C++]原生数组不可赋值引起的编译错误该如何解决?
在 C/C++ 中,原生数组(C-style array)不可直接赋值的特性确实导致编译错误
下面是本人在刷算法题写cmp函数时遇到的错误:
1234567bool cmp(int a[5], int b[5]) { if(a[4] != b[4]) return a[4] > b[4]; if(a[1] != b[1]) return a[1] > b[1]; return a[0] < b[0];}
根本原因
数组名本质
数组名 arr1 实际上是一个指向首元素的常量指针(int* const)
在传递时,数组作为函数参数时退化为指针
看似接受两个长度为5的数组,但实际等价于:
1bool cmp(int* a, int* b) { ... }
有些编译器可能不会报错,但我装的mingw估计管的挺严的,没让我过编译
修正方案
显示传递数组大小
1bool cmp(int* a, int* b, size_t size) { ... }
使用数组引用
...
详情 2025-04-11vector拷贝说的道理
偶然在群里聊到这个了,感觉这个切口对于理解OOP**“封装”**这个概念颇为重要
以下内容由d老师辅助生成,本人整理
浅拷贝与深拷贝区分、
1. 浅拷贝(Shallow Copy)
直接复制成员的值:将对象的成员变量(包括指针)逐字节复制到新对象。
指针共享内存:新旧对象的指针成员指向同一块内存地址。
例如 默认的拷贝构造函数 和 动态分配的数组 or 指针逐字节复制
特性:
当某个类一个对象析构时,另一个也会被析构,同时释放两次内存
通过指针实现的拷贝复制,修改会直接影响另一方
1234567class Data {public: int* arr; int size; Data(int n) : size(n) { arr = new int[n]; } ~Data() { delete[] arr; } // 析构函数释放内存};
2. 深拷贝(Deep Copy)
独立复制资源:为新对象分配新的内存,并复制原对象指针指向的所有内容。
资源完全独立:新旧对象的指针指向不同的内存区域。
...
详情 2025-01-081月7日之事
一月七日 某 完成了第一次外出志愿观众参与节目录制 归校
节目本身没什么好说,只是,突然恍惚了一霎,我的青春是怎么样的,和他们的怎么比呢
昨天看到一句话:我们无法同时拥有青春和对于青春的感受。回想起来20年(又或者是21年),我在bigfun的群里感叹我所过的人生是多么的普通,我也希望拥有不那么普通的人生。当时得到的答案是极其范式的:平凡而普通的生活已经是许多人遥不可及的奢求了。然而,我现在再来回头看我的高中,即便是初中,又有多少回忆我想珍惜,我想揣在怀里,我想重回过去,我想,我想。
确实啊,我能感受到我的青春的时候,我的青春已经死了
彻底的
过去的子弹已经发射,在这个晚上正中眉心
我的初中与高中也真干了不少值得现在的我羡慕的事情,这些事情,哪一件对现在的我而言都是足够青春的。虽然显著的不是那种足够经典的,但也符合我自己的想象。然而,我总是选择放弃,总是试图放下其他的东西去追求所谓学生阶段的真正的正确。然而12年下来我没有得到我奢求的,没有得到我认为的所应得的,虽然不至于痛苦,但是我都放弃了那么多我所热爱的事情,却没有在当今的评判体系下,在优绩主义的评判下成果。按理说 我应该走的 ...
详情