- 博客(116)
- 收藏
- 关注
原创 操作系统实现之内存分页机制.虚拟空间
内存虚拟存储主要是为了将一个进程分为不同页.存储到不同物理页中.然而不同进程的虚拟地址是可以相同的.因为MMU把进程的虚拟地址映射到各个不同的物理地址中.以下操作系统采用二级分页.一开始CS:IP寄存器.将CS的基地址跟IP的偏移地址进行相加.得到线性地址.接着.线性地址的高10位用于当作页目录表的索引.页目录表保存的是页表的物理地址.接着.线性地址的低10位用于当作页表的索引.页
2016-06-26 01:09:12
2842
1
原创 操作系统实现之保护模式
保护模式主要是为了防止用户程序故意使坏.而且用户所引用的地址都是指向真实的物理地址.跟内核属于同特权级.不利于安全.另外保护模式将是32/64位.大家所说的实模式一般指的是32位的cpu在16位模式下的状态.不是指的是16位cpu.本来没有实模式这个说法.不过后来出现保护模式.于是就出现了实模式说法保护模式下的改变通用寄存器扩展为32位段寄存器保存的不再是段基址,而是段选择子(
2016-06-18 14:16:15
2208
1
原创 操作系统之loader的实现
上一章已经讲解了笔记本从开始到bios加载MBR(主引导扇区)的相关内容.这章将介绍MBR跳转到loader的执行,以及用显卡直接输出到字符.有可能会有疑问为何还要写loader.因为mbr只能是512字节.这么小的空间没法做啥.只能作为跳板所以写个loader用来加载内核.从图可知.显卡的文本模式映射到了B8000处.只要把字符移到此处.就可以在屏幕显示字符,并且每个字符占用
2016-06-18 00:40:29
1894
原创 bios内存分布-编写最简单操作系统(mbr)
0-3ff 1k用于中断向量表400-4ff 256B bios数据区500-7Bff 30kb 可自定义区域7C00-7BFF 512b MBR被bios加载到的内存区域7E00-9FBFF 608k 自定义区域9FC00-9FFFF 1kb 扩展bios数据区A0000-AFFFF 64k 彩色显示适配器B0000 B7FFF 32k
2016-06-17 18:51:53
5385
原创 转换大小写int 7ch 中断处理程序
assume cs:codedata segmentdb 'conversation',0data endscode segmentstart : mov ax,cs mov ds,ax mov si,offset capital ;指向源代码地址 mov ax,0 mov es,ax
2016-03-15 13:35:40
794
转载 C++ 内存分配(new,operator new)详解
出处:http://blog.csdn.net/wudaijun/article/details/9273339 本文主要讲述C++ new运算符和operator new, placement new之间的种种关联,new的底层实现,以及operator new的重载和一些在内存池,STL中的应用。一 new运算符和operator new(): n
2015-07-02 01:02:47
584
原创 范型编程与STL--第二章iterator(迭代器)解析
C++完成线性查找c语言函数find查找只能查找某一个类型的数组,在C++中可以使用模板template//C++模板T *find2(T *first, T *last, T value);更一般化templateIterator find(iterator first, Iterator last, const T &value){ while (first != l
2015-06-18 13:48:21
594
原创 范型编程与STL--第一章(1)
1.STL算法范型不和任何特定数据结构和对象类型绑定一起2.STL可以扩容的3.iterator的适用范围可以从普通c语言指针到输出流的外层包装,很广泛自己动手写一个从输出流一次返回一行的iteratorclass line_iterator{public: istream *in; string line; bool is_valid; void read()
2015-06-17 15:48:48
423
原创 分数加减乘除法==自己加了乘除法
分数加减法时间限制:3000 ms | 内存限制:65535 KB难度:2描述编写一个C程序,实现两个分数的加减法输入输入包含多行数据 每行数据是一个字符串,格式是"a/boc/d"。 其中a, b, c, d是一个0-9的整数。o是运算符"+"或者"-"。 数据以EOF结束 输入数据保证合法输出对于输入数据的每一行输出两个分
2015-05-20 19:29:28
689
原创 笨小熊
笨小熊时间限制:2000 ms | 内存限制:65535 KB难度:2描述笨小熊的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn
2015-05-16 13:54:06
518
原创 阶乘因式分解(二)
描述给定两个数n,m,其中m是一个素数。将n(0注:^为求幂符号。 输入第一行是一个整数s(0随后的s行, 每行有两个整数n,m。 输出输出m的个数样例输入3100 516 21000000000 13样例输出241583333329http://acm.nyist.net/
2015-05-15 17:24:40
467
转载 为什么需要auto_ptr_ref
这几天开始拜读侯捷先生和孟岩先生的译作《C++标准程序库:自修教程与参考手册》 。两位先生确实译功上乘,读得很顺。但是读到P55页关于auto_ptr_ref的讨论,却百思不得其解:为什么需要引入auto_ptr_ref这个辅助类呢?从书中描述来看,仿佛与拷贝构造函数 、右值 、类型转换 有关。于是,结合auto_ptr的源代码,google之、baidu之,找了一推资料,终于初步 搞
2015-04-26 18:28:31
389
转载 c++中const变量真的不可以修改吗?
编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。在学c++的时候,看到的大部分的书籍对const关键字的介绍都是:const关键字修饰的变量的值是不可被修改的。但是事实真是如此吗?今天做了一个小的实验,发现const变量是可以被修改的。c++代码如下: 1 #include
2015-04-25 12:33:50
2414
原创 一张图搞懂虚函数表原理
众所周知,一个含有虚函数表的子类对象的首地址为指向虚函数表的虚函数指针的地址比如是一个vptr指针指向虚函数表,有一个含有虚函数表的子类对象(int *)&b,取4个字节,其实该地址是&vptr指针,而虚函数表的地址(vptr指针所指向的地址)(int *) *((int *)(&b))才是虚函数表真正的地址(也是保存第一个函数的地址的地址)(函数类型)*((int *) *(in
2015-04-24 17:44:10
598
转载 C++匿名对象解析
我们知道在C++的创建对象是一个费时,费空间的一个操作。有些固然是必不可少,但还有一些对象却在我们不知道的情况下被创建了。通常以下三种情况会产生临时对象: 1,以值的方式给函数传参; 2,类型转换; 3,函数需要返回一个对象时; 现在我们依次看这三种情况: 一,以值的方式给函数传参。 我们知道给函数传参有两种方式。1,按值传递;2,按引用传递。按值
2015-03-28 00:44:09
4213
1
转载 c/c++:efficient c++,返回值优化,RVO
返回值优化,是一种属于编译器的技术,它通过转换源代码和对象的创建来加快源代码的执行速度。class Complex//复数{ friendd Complex operator + (const Complex & , const Complex&);public: Conplex(double r=0.0,double i= 0.0): real(r),imag(i){
2015-03-28 00:37:36
412
转载 使用递归函数,输出n个元素的所有子集
题目描述:请编写一个递归函数,用来输出n个元素的所有子集。例如,三个元素{a,b,c}的所有子集是:{},{a},{b},{c},{a,c},{ac},{b,c},{a,b,c}.解题思路:根据子集的定义,集合中的每一个元素在子集中都有两种状态:‘1’表示出现,'0'表示不出现;如果所有的元素都不出现,则该子集是空集,如果所有的元素都出现,则该子集是全集。我们定义一
2015-03-22 15:49:25
4149
原创 计算名次元素在队列中的名次
[计算名次] 元素在队列中的名次(r ank)可定义为队列中所有比它小的元素数目加上在它左边出现的与它相同的元素数目。例如,给定一个数组a=[4, 3, 9, 3, 7]作为队列,则各元素的名次为r =[2, 0, 4, 1, 3]。函数R ank(见程序2 -5)可用来计算数组a[0: n-1]中各元素的名次。可以根据a的元素之间所进行的比较操作来估算程序的时间复杂性。这些比较操作是由i f语句
2015-03-21 16:43:13
658
原创 递归函数生成全排列
检查n个不同元素的所有排列方式来确定一个最佳的排序。比如a,b,c的排列方式有>这六种。 用c++非递归函数实现比较难,用递归实现还是ok的 其核心思想是:将每个元素放到n个元素组成的队列最前方,然后对剩余元素进行全排列,依次递归下去。 比如: a b c 首先将a放到最前方(跟第一个元素交换),然后排列b c, 然后将a放回本来位置 结果 a b c; a
2015-03-21 01:16:32
1840
原创 C++ Primer 第5版之文本查询程序类
#include#include#include#include#include#include#include#includeusing line_no = vector::size_type;using namespace std;class QueryResult;class TextQuery{public: TextQuery(ifstream&);//用来
2015-03-16 20:12:20
942
原创 C++ 类类型隐式转换
隐式类类型转换:“可以用单个实参来调用的构造函数定义了从形参类型到该类型的一个隐式转换。”(C++ Primer)首先要单个实参,你可以把构造函数colour的默认实参去掉,也就是定义一个对象必须要两个参数的时候,文件编译不能通过。(以上只是将内置类型转换为自定义类型)重载double,int 将用户自定义数据类型转换为内置类型当构造函数只有一个
2015-03-12 23:45:28
736
原创 初学c++引用计数器
以后会多写些本质论的文章,这样可以更好的引导自己去深入思考。 为什么要用引用计数? 场景:代码里X是一个非常重要的资源,模块A,B,C都有对其指针的引用,那么为了不出现内存泄露,常规的代码我们要怎么写? 1. A 模块用完X时,需要检查B,C是否还在引用X,如果B,C有一个在用,那么X只要删除掉对A的引用就可以了,
2015-03-10 18:26:09
1242
转载 C++转换构造函数和隐式转换函数
今天是第一次听到C++还有个转换构造函数,之前经常见到默认构造函数、拷贝构造函数、析构函数,但是从没听说过转换构造函数,隐式转换函数也是一样,C++的确是够博大精深的,再次叹服! 其实我们已经在C/C++中见到过多次标准类型数据间的转换方式了,这种形式用于在程序中将一种指定的数据转换成另一指定的类型,也即是强制转换,比如:int a = int(1.23),其作用是将1.2
2015-02-15 15:31:12
558
原创 类模板与static成员
1.从类模板实例化的每个模板类都有自己的类模板数据成员,该模板类的所有对象共享一个static数据成员2.和非模板类的static数据成员一样,模板类的static数据成员也应该在文件范围定义和初始化3.每个模板类有自己的类模板的static数据成员副本#includeconst double pi = 3.14159;using namespace std;templa
2015-02-02 22:43:51
509
转载 C++类中的静态成员变量和静态成员函数的作用
数据成员可以分为静态变量、非静态变量两种。静态成员:静态类中的成员加入static修饰符,即是静态成员,可以使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以 静态成员不能访问非静态成员,因为静态成员存在于内存,所以非静态成员可以直接访问类中的静态成员。非静态成员:所以没有加static的成
2015-01-30 17:18:52
537
转载 C++ 顶层底层 const
本文的主要参考来源来自于: C++ Primer 中文版(第 5 版) 第 57 面至第 58 面1. 顶层 const 与底层 const 概念我们知道,指针本身是一个对象,因为,指针实际对应着内存单元的一段存储空间,然而,指针所指向的也是一个数据对象,因此,指针是一个常量与指针所指向的是一个常量是两个完全不同的概念, 顶层 const 表示的是 指针本身是一个常量
2015-01-29 22:18:05
484
原创 企业级数据结构-栈的链式存储设计与实现
1、基本概念链式栈是一种特殊的链表,下面实现的代码是基于链表而来的,请参考前几篇的博客linkstack.h#ifndef _MY_LINKSTACK_H_#define _MY_LINKSTACK_H_typedef void LinkStack;LinkStack* LinkStack_Create();void LinkStack_Destroy(L
2015-01-20 16:56:24
438
原创 企业级数据结构-顺序栈实现
Stack基本概念栈是一种 特殊的线性表 栈仅能在线性表的一端进行操作栈顶(Top):允许操作的一端栈底(Bottom):不允许操作的一端Stack的常用操作创建栈销毁栈清空栈进栈出栈获取栈顶元素获取栈的大小 #ifndef _MY_STACK_H_#define _MY_STACK_H_
2015-01-20 15:58:52
609
原创 企业级数据结构之-双向链表
双向链表//大家一定要注意:教科书不会告诉你 项目上如何用;哪些点是项目的重点;做一个企业级的财富库,完成你人生开发经验的积累,是我们的学习重点,要注意!1、基本概念 单链表的结点都只有一个指向下一个结点的指针单链表的数据元素无法直接访问其前驱元素逆序访问单链表中的元素是极其耗时的操作!len = LinkList_Length(list);
2015-01-20 15:48:41
491
转载 ACM牛人给的新手建议
ACM牛人给的新手建议 ACM进阶一位高手的建议:一般要做到50行以内的程序不用调试、100行以内的二分钟内调试成功.训练过ACM等程序设计竞赛的人在算法上有较大的优势,这就说明当你编程能力提高之后,主要时间是花在思考算法上,不是花在写程序与debug上。下面给个计划你练练:第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因
2015-01-19 14:32:54
646
原创 企业级数据结构-循环链表(约瑟夫问题)
循环链表1、基本概念循环链表的定义:将单链表中最后一个数据元素的next指针指向第一个元素循环链表拥有单链表的所有操作创建链表销毁链表获取链表长度清空链表获取第pos个元素操作插入元素到位置pos删除位置pos处的元素新增功能:游标的定义在循环链表中可以定义一个“当前”指针,这个指针通常称为游标,可
2015-01-18 14:08:48
407
原创 企业级数据结构-线性表顺序存储
1、基本概念2、设计与实现插入元素算法判断线性表是否合法判断插入位置是否合法把最后一个元素到插入位置的元素后移一个位置将新元素插入线性表长度加1获取元素操作判断线性表是否合法判断位置是否合法直接通过数组下标的方式获取元素删除元素算法判断线性表是否合法判断删除位置是否合法将元素取出将删
2015-01-18 00:03:06
427
原创 企业级数据结构之-顺序表的连式存储
线性表的链式存储1、基本概念链式存储定义为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息。 表头结点链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息数据结点链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息尾结点链表中的最后一个数据结点,其
2015-01-17 18:24:49
473
原创 小学期作业-老师评分系统c++stl实现
#include#include#include#include#include#include#includeusing namespace std;class Teacher{public: string name; int xuehao; int score; Teacher(string str1, int xh, int sc)//有参构造函数 { th
2015-01-13 16:02:50
806
转载 字符串匹配的Boyer-Moore算法
作者: 阮一峰Boyer-Moore算法不仅效率高,而且构思巧妙,容易理解。1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了这种算法。下面,我根据Moore教授自己的例子来解释这种算法。1.假定字符串为"HERE IS A SIMPLE EXAMPLE",搜索词为"EXAMPLE"。2.
2015-01-13 01:34:34
406
原创 c++学生管理系统(STL)
哥小白刚刚涉及一些STL想巩固之前学的C++和STL, c++第一次用类,复制构造函数和操作符重载,STL写学生管理系统,,可惜没用继承多态(不知道哪里可以用 - _-) 写这么长代码,想了很久没思路,看了看别人代码思路,自己也写了这个简单的管理系统 自己用到了C++11新语法,vs2010以下编译器不会通过 STL的sort和(Greate()
2015-01-13 00:52:15
2867
1
原创 C++输入输出流
I/O(输入/输出)流类库提供对象之间的数据交互服务 流类库预定义了一批流对象,连接常用的外部设备 程序员可以定义所需的I/O流对象,使用流库提供的工作方式 实现数据传输1.流类和流对象(概括)1.程序中,对数据的输入/输出是以字节流实现的2.应用程序对字节序列作出各种数据解释 3. I/O系统的任务就是在内存和外部设备之间稳定可靠地
2015-01-11 16:18:33
421
原创 C++中的抽象类(接口和协议)
有关多继承的说明被实际开发经验抛弃的多继承工程开发中真正意义上的多继承是几乎不被使用的多重继承带来的代码复杂性远多于其带来的便利多重继承对代码维护性上的影响是灾难性的在设计方法上,任何多继承都可以用单继承代替多继承的麻烦:多继承中的二义性C++中是否有Java中的接口概念?绝大多数面向对象语言都不支持多继承绝大多数面向对象语言都支持接口的概念C++中没有
2015-01-05 13:14:27
532
原创 重写pk重载理解区分
重写 PK 重载理解函数重载必须在同一个类中进行子类无法重载父类的函数,父类同名函数将被名称覆盖重载是在编译期间根据参数类型和个数决定函数调用函数重写必须发生于父类与子类之间并且父类与子类中的函数必须有完全相同的原型使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义)多态是在运行期间根据具体对象的类型决定函数调用
2015-01-05 13:05:24
521
原创 C++多态基础以及编译器多态实现原理
1、 多态基础多态的实现效果多态:同样的调用语句有多种不同的表现形态;多态实现的三个条件 有继承、有virtual重写、有父类指针(引用)指向子类对象。多态的C++实现 virtual关键字,告诉编译器这个函数要支持多态;不要根据指针类型判断如何调用;而是要根据指针所指向的实际对象类型来判断如何调用多态的理论基础 动态联编PK静态联编。根据
2015-01-05 12:36:38
549
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人