- 博客(33)
- 资源 (4)
- 收藏
- 关注
原创 ucore lab1结合原理的实现
首先,从计算机硬件启动开始说起,开始启动的时候,CPU产生一个RESET,设定一些处理器,从ROM的0Xfffffff0开始执行,进行POST(上电自检),初始化硬件设备,紧接着搜索操作系统来启动,在这个过程中试图访问磁盘的第一个扇区也称为引导扇区(512个字节),只要能找到一个有效的磁盘,那就将这个扇区拷贝到内存0x00007c00开始的位置,跳转,加载这个扇区的代码,也就是bootloader
2018-01-07 20:24:47
1128
原创 TCP/TP基础(二)以太网协议,ARP协议,ICMP协议
(1)最大传输单元MTU以太网和IEEE 802.3对数据帧的长度都有一个限制,其最大值分别是1500和1492字节。链路层的这个特性称作M T U,最大传输单元。不同类型的网络大多数都有一个上限。如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就需要进行分片(fragmentation),把数据报分成若干片,这样每一片都小于MTU。路径MTU
2017-12-22 13:07:37
1614
原创 object Model(对象模型):关于vptr和vtbl
这里设置了3个class,A,B,C之间是继承的关系,A有之间的data1和2,B继承了A,有了A的数据,然后加上自己的数据,C也是。如果一个类里面有一个虚函数,这个对象里面就会多了一个指针,指向虚函数表。如果父类有虚函数,子类一定有,会继承父类虚函数的调用权,这时候以B为例子,B推翻了vfunc1()重载了,留下了vfunc2().vptr关联了vtbl(里面都是函数指针)然后关联了
2017-12-17 16:41:20
1159
原创 数量不定的模板参数、auto、for的新形式、reference
1、variadic template(c++11)void print(){}templatevoid print(const T& firstArg,const Types&... args){ cout << firstArg << endl; print(args...);}测试代码:print(7.5,"hello",bitset(377),42);...在这里表
2017-12-17 14:55:39
431
原创 成员模板、模板的偏特化和特化、模板模板参数
成员模板就是在一个类里面再声明一个模板,一般来说这个模板是为了能够在类里面实现利用派生类对其进行一个初始化。为了设计一个构造函数,以pair为例子。利用派生类鲫鱼和麻雀,来构造父类的对象,鱼类和鸟类。这就是成员模板在标准库里的用途。模板的特化:template struct hash{};//泛化template<>//特化struct hash{ size_t o
2017-12-10 14:44:06
727
1
原创 智能指针(pointer like class)和仿函数(function like class)
智能指针的语法使用,*以及->重载,仿函数的形式
2017-12-10 13:19:30
635
原创 转换函数与显式构造
转换函数,谁把谁转成什么呢。再考虑一下这个函数出现的位置,我们就可以知道,把一个class转换为另一种类型,这种类型可以自己来定义。class A{public: A(int num,int den = 1):num(num),den(den){} operator double() const{//转换函数不可能去改变里面的数据,所以const return (
2017-12-10 11:12:03
243
原创 第十章结构和联合、十一章动态内存分配
第十章结构C语言中的结构就是Struct,几个特点注意:1、不能自引用。要用自身必须要用指针。2、复合使用2个结构体,需要在前面使用不完整声明例如struct B;struct A{ struct B;...}struct B{...}3、结构的存储分配需要满足边界对齐条件,如:struct ALIGN{ char a; int b;
2017-12-08 16:07:50
251
原创 第七章:函数、第八章:数组
小结函数这一章,分析了数组和指针下标的优劣性,考虑了怎么提高使用指针的效率,多维数组,指针数组的初始化以及函数的形参问题,对于表格,二维数组矩阵的乘法,8皇后问题进行解答
2017-12-08 15:06:54
262
原创 第六章课后题:质数Eratosthenes筛选法
#include #include #include #include void isprime(int *a,int n){ memset(a,1,n*sizeof(a[0]));//利用a数组做标记,看这个数是不是不是质数 for (int i = 2; i <= sqrt(n+0.1); i++) { if(a[i]) for (int j = i*i; j <=
2017-12-08 13:34:56
279
原创 第六章:指针
一、先来看定义式:int a = 300;int b* = &a;这时候b的内存里面存的是a的地址,a的内存地址里面存300。比如这时候设置一个int* c =b;一个指针作为右值,是把它的值交出去,所以c得到了a的地址,如果是作为左值,就是获得右值放入自己的地址内容里。这非常重要!!当然*b就是间接访问,由于b的值是一个地址,然后就可以对这个地址取值,就取了a的值。二、未初始
2017-12-08 13:26:32
271
原创 第十七章经典抽象数据结构四:树的前中后序遍历
#include "tree.h"#include #include #include #include using namespace std;stack mystack;stack poststack;//********************递归版***********************////void do_pre_order(Node* tree){//递归实现
2017-12-07 20:52:44
270
原创 利用随机数函数掷骰子
//首先掷骰子需要概率相等,如果随机数生成0到32767,那么这些值的概率就不是相等的,32766,32767返回的值是0,1会增加概率//所以,一旦出现就重新生成.#include #include #include #include const unsigned int MAX_OK_RAND = (RAND_MAX/6)*6-1;//(int)((((long)RAND_MAX
2017-12-07 14:35:17
2127
原创 树用链表实现(链表使用二重指针减少判断以及空间复杂度)
首先定义每一个结点:struct Node{ int value; Node* left; Node* right;};查找函数:Node** find(int i){ Node* tmp; Node** link =&root; while ((tmp=*link) != NULL) { if(tmp->value > i) link = &tmp->left
2017-12-07 13:03:42
524
原创 第十七章经典抽象数据结构二:树(数组实现)
二叉搜索树插入:可以首先要判断树是不是为空(针对链表结构是必须的,因为要分配动态内存),然后插入。有2种选择,递归和循环,因为递归是尾部递归,牺牲了空间复杂度获得了可读性,可以转换为循环。删除结点:分为3种情况:1、删除没有孩子的结点,直接删除2、删除只有一个孩子的结点,删除原有结点,指向孩子结点。3、删除有2个孩子的结点,删除左子树的最大结点,把值放在当前结点。代码实
2017-12-06 20:49:11
256
原创 第十七章经典抽象数据类型(一)
堆栈,没什么太多要总结的,主要是实现问题,这里自己实现了一下,当然从书本中吸取到的是程序代码效率的提升和assert断言的应用判断。代码的提升在于top_element的初值是0和1,对于push,pop本来就要改变的函数来说没什么变化,但是对于top这样的函数,只需要返回其顶部数据,但是每一次都要-1的话,就会成为很大的困扰,汇编出来的时候,必然会减去1乘以这个数组的类型大小,这就使得效率降
2017-12-05 21:17:26
199
原创 第四章:语句与第五章:操作符和表达式
第四章的语句没有什么特别的东西,都是if,while,for,等正常使用的语句,唯一需要注意的是,switch语句中加default语句形成好习惯,之后的学习中会提到使用函数指针来形成转接表代替某些switch操作。goto语句不提倡使用虽然可以从最内层的循环直接跳出,但是很危险,容易产生依赖,跳出内层循环可以以如下的方式进行:enum{exit,ok} status;status =
2017-12-05 19:22:06
221
原创 第二、三章小结
第二章主要是阐述了C语言的环境:编译和执行。在编译中基本上编译器分为4部分动作:1.由预处理器进行处理,执行一些文本操作,#define以及#include这些动作2.编译,-s把代码翻译成汇编语言3.汇编,把汇编语言翻译成二进制文件,也就是各个目标代码4.链接,最后把目标代码捆绑在一起,同时引入标准库的函数程序。第三章主要是通过数据来描述各个类型:1.为了保持可移植性
2017-12-05 18:23:48
201
原创 第一章:快速上手注意点
给出第一章的源代码,简要的述说一下注意事项(平时在编程中经常会忘记的)#include #include #include #define MAX_COLS 20 /* max # of columns to process */#define MAX_INPUT 1000 /* max len of input & output lines */int read_column
2017-12-05 16:39:14
253
原创 以简单的设计模式代码阐述如何设计委托
先来看看composite组合模式下,是怎么实现委托的,如果现在面对一个问题,file system,有目录,目录里可以放文件,目录还能和其他的文件结合在一起放在另外的目录里面,这时候需要写个个体,需要一个组合物,这个组合物应该可以容纳组合物和个体,那么如何做到,一个容器容纳2个不同的东西,除非他们是is a拥有父类,这样其实就是属于同一种东西,只是不同的表现罢了,所以由如下的关系图:clas
2017-12-04 22:26:10
228
原创 侯捷老师的虚函数和多态小结
一个类中成员函数分为3种:non-virtual:不希望派生类对其进行重写(override).virtual:希望派生类对其进行重写(override).pure-virtual(纯虚函数):希望派生类一定要对其进行重写class Shape{public: virtual void draw() const =0;//pure-virtual virtual
2017-12-04 18:48:39
526
原创 面向对象编程的3种关系:组合,委托和继承
看了侯捷老师一节课的视频,做一个记录和小结,在OOP语言中,面向对象编程,类和类之间有3种关系:1)Inheritance(继承)2)Composition(复合)3)Delegation(委托)先从Compositon开始讲起,其实在C语言中也见到过,一个结构体里面包含另外一个结构体,在C++中复合也是一样的,侯捷老师以标准库来形象的说明了这种情况,在queue类中包含了dequ
2017-12-03 22:10:00
5187
原创 浅谈static、类模板和函数模板
首先,我们先来看static,从C语言我们知道,他是一个静态变量的标识符,可以让一个变量在离开作用域后,还能够存活。那么如果我们在类当中定义了一个static数据会怎么样,这个static数据会在程序开始前就会存在,而且仅此一份。那么static function呢,简而言之就是,操纵static变量的函数,举个例子,现在我们要计算一个基金增长利率,那么这个利率对于所有的对象来说,都是一样的,那么
2017-12-03 15:31:55
2156
原创 C++编程中类class的编写(二):含指针数据的类
从上一篇文章一中,我们提到过编写的类分为2种,在这里再对含指针数据的类来进行考量,对于含指针数据的类,必须要进行自己编写拷贝构造和拷贝赋值(为了防止浅拷贝也就是2个对象的指针数据指向同一块内存单元),同时也必须使用析构函数(对于指针进行了new或者malloc进行动态分配,必须回收资源),那么由此以编写简单的string类做一个总结:class String{private: char*
2017-12-03 11:24:29
629
原创 观侯捷老师new和delete以及malloc在vc当中调试模式和运行下分配内存
在讲到new和delete不得不想到c语言中的malloc and free 以及其经常用于动态内存分配,而简单来说,动态内存分配在堆中,不会因为离开作用域而删除,而栈中存储的一般为函数参数,返回值以及作用域下的local orient.那我们可想而知的是,在函数中如果我创建指针,肯定为了不浪费内存,我们选择动态分配内存的方式,那么就是利用C++中的new或者c中的malloc,我们需要养成一
2017-12-02 19:53:10
709
5
原创 C++编程中类CALSS的编写(一):不含指针数据的类
首先,在我理解当中,C++编程中的类可以分为两种类型,第一种是包含指针的,另一种则是不包含的,不包含指针的类,其中private里填写自己的数据,这时候其中的数据类型比如int,double,float等等类型都是标准库里面已经写好的,也自动为我们分配了内存,不用去考虑内存分配问题,也就不会有别名的问题产生,当然此时,析构函数也不用编写了,在程序结束的时候,自动析构。此时主要编写的程序有构造函数,
2017-12-02 17:55:16
605
深入理解计算机系统视频CMU的 带字幕 CSAPP
2018-05-08
c++教程网的linux网络编程视频下载
2017-12-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人