- 博客(43)
- 资源 (4)
- 收藏
- 关注
原创 14、Inline Functions
理论上,一个比较干净的做法是使用inline函数来set和get函数由于我们受限只能在上述的两个函数中对_x直接存取,因此也就将稍后可能发生的data members的改变所带来的冲击最小化的。如果把这些存取函数声明为inline,我们就可以继续保持直接存取members的那种高效率---同时我们兼顾了函数的封装性。此外,加法运算符不再需要被声明为Point的一个friend。
2024-11-20 08:49:02 383
原创 13、指向Member Function的指针
或者和指向member function的指针声明语法,以及指向“member selection运算符”的指针,其作用是作为this指针的空间保留者。这也是为什么static member functions(没有this指针)的类型是“函数指针”,而不是“指向member function的指针”之故。
2024-11-14 08:56:04 466
原创 12、Virtual Member Functions
为了支持virtual function机制,必须首先能够对于多态对象有某种形式的“执行期类型判断(runtime type resolution)”。也就是说以下的调用操作需要ptr在执行期的某些关键信息。ptr->z();如此一来,才能够找到并调用z()的适当实例。或许最直接了当但是成本最高的解决方法是把必要的信息加在ptr身上。在这样的策略下,一个指针(或是一个reference)持有两项信息。它所参考的对象的地址对象类型的某种结构,用以正确决议出z()函数实例的地址。
2024-11-08 08:54:45 829
原创 11、Member的各种调用方式
由于member function可以被重载化(overload),所以需要更广泛的mangling 手法,以提供绝对独一无二的名称。1)改写函数的signature(译注:指的是函数原型)以安插一个额外的参数到member function中,用以提供一个存取管道,使class object得以将此函数调用。C++的设计准则之一就是:nonstatic member function至少必须和一般的nonmember function有相同的效率。它提供了一个意想不到的好处:称为callback函数。
2024-10-25 08:46:40 598 1
原创 10、继承与Data Member
在C++继承模型中,一个derived class object所表现出来的东西,是其自己的members加上其base class(es) members的总和。至于derived class members和base class(es) members的排列顺序,则并未在C++ Standard中强制规定,理论上编译器可以自己安排。
2024-10-14 09:04:22 722
原创 2. ZMQ不同样式的路由方式
1、ZMQ_REQclientserviceservicesserviceDirectionLast peerBlock2、ZMQ_REPDirectionLast peerzmq_sendDirectionBlockDirectionSee text在以上的字段,对于该socket处于bind()或者connect()状态,此时路由是什么效果呢?
2024-09-25 13:21:52 687
原创 1. ZMQ发送和接收数据消息格式总结
透传.When a 'ZMQ_DEALER' socket is connected to a 'ZMQ_REP' socket each message sent must consist of an empty message part, the delimiter, followed by one or more body parts.完全是透传的样式,经过该样式的socket不添加或者去除任何消息。添加第1帧,内容是发送端的ID地址,然后告知应用层。去掉第1帧,第1帧作为路由地址发送。
2024-09-25 08:24:31 371
原创 ZMQ专栏
在学习和使用ZMQ的过程中,记录ZMQ最精华的部分。我对ZMQ的本质理解是什么?即ZMQ定义了样式通信,这种样式通信又可以转换成数据收发(发送端和接收端),这种数据收发又可以转换成数据消息格式和路由。因此ZMQ的本质最终是数据消息格式和路由。
2024-09-25 08:17:25 97
原创 9、Data Member的存取
答案是“当Point3d是一个derived class,而继承结构中有一个virtual base class,并且被存取的member(如x)是一个从该virtual base class继承而来的member”时,就会有重大的差异。这会在接下来的章节进行说明(继承对于member布局的影响)。若取一个static data member的地址,会得到一个指向其数据类型的指针,而不是一个指向其class member的指针,因为static member并不含有一个class object之中。
2024-09-22 17:24:54 769
原创 8、Data Member的绑定
但这并不一直都是正确的,而是C++2.0的Reference manual修订后才是正确的。这个古老的语言规则被称为“member rewriting rule”,大意是“一个inline函数实体,在整个class声明未被完全看见之前,是不会被评估求值(evaluated)的”。当后续再有length的nested typedef声明出现时,C++ Standard就把稍早的绑定标记为非法。Argument list中的名称还是会在他们第一次遭遇时被适当的决议(resolved)了。
2024-09-22 12:04:33 172
原创 7、类的大小
在GCC x86 64Bit中,一个empty virtual base class被视作derived class object最开头的一部分,也就是说它没有花费任何的额外空间。上述的X,Y,Z,A中没有任何一个class内含有明显的数据,其间只表示了继承关系,所以有人认为每个class的大小应该是0。在32位计算机中,通常alignment为4bytes(32位),以使bus的“运输量”达到最高的效率。对于C++的类而言,类的大小似乎并非完全由用户控制,我们看看如下的代码。
2024-09-14 08:17:39 402
原创 6、成员们的初始化列表
事实上,有些微妙的地方需要注意,list中的项目顺序是由class中members声明顺序决定的,而不是initialization list中的编排顺序决定的。在本例子中,_name被声明在_cnt之前,所以它的初始化较早。问题在于,由于声明顺序的缘故,initialization list中的i(j)其实要比j(val)更早的执行,但是j一直没有初始值,所以i(j)的执行结果导致i无法预知其值。在下面的情况下,为了让你的程序被顺序的编译,你必须使用member initialization list。
2024-09-11 08:42:36 256
原创 5、程序转换语意学
如果Point3d class声明一个或一个以上的virtual functions,或内含一个virtual base class,那么使用上述的函数将会导致那些“被编译器产生的内部members”的初值改写。把一个class object当作参数传给一个函数(或是作为一个函数的返回值),如下的代码要求局部的实例x0以memberwise的方式将xx当作初值。在编译器的实现技术上,有一种策略是导入临时性object,并调用copy constructor将它初始化,然后将此临时性object交给函数。
2024-09-05 08:48:27 514
原创 4、Copy Constructor的构造操作
1)当一个class内含一个member object而后者的class声明一个copy constructor时(不论是class设计者显示的声明,还是编译器隐式的合成),例如下面的代码,String显示的声明了,而Word隐式的合成。然后,Bear class object以另一个Bear class object作为初值,我可以看到yogi的vptr值拷贝给了winnie的vptr了,这样的操作是安全的,它是通过编译器合成的拷贝构造函数完成的。对于Word verb = noun;
2024-08-29 08:58:09 1088
原创 3、Default Constructor的构造操作
如果一个class没有任何的constructor,但是它内含一个member object,而后者有一个default constructor,那么这个class 的implicit default constructor就是nontrivial,编译器需要为该class合成一个default constructor。例如如下的代码,代码中A,B,C均需要合成一个default constructor,并在里面安插那些“允许每一个virtual base class的执行期存取操作”的代码。
2024-08-18 11:01:12 687
原创 1、 C++对象模型简介
为什么C++可以“自动完成”这么多事情,多态的底层实现是什么样子的,理解了C++的对象模型后,可以写出比较没有错误且比较有效的代码。
2024-08-02 08:57:52 994
原创 ucoreOS操作系统博客导航栏
跟着清华大学的学堂在线公开课,对操作系统的原理和实验有了更加深刻的理解。回顾自己2年来从不懂实验的基本的宏定义,到能用预编译指令展开宏,从代码深奥无比,支离破碎的理解,到能全局的理解一个或多个实验。其中最值得肯定的是走了一条正确的道路,即理论加实验学习,尤其提高实验的投入时间。其次,清华大学的操作系统学习是一门十分的系统课程,有利于提高系统思维。
2024-04-03 07:50:13 564
原创 实验二 物理内存管理-实验部分
在X86系统中,正好支持分段和分页这两种机制。将逻辑地址转换成线程地址空间的过程,称为分段,而将线性地址转换成物理地址空间的过程称为分页。分段和分页的过程如下图所示。图3-1 分段和分页分段提供一种划分处理器地址内存空间成更小的保护地址空间,这种地址空间称为段。段可以用来维持一个程序的代码、数据、堆栈。或者用来维持一个系统的数据结构,如TSS、LDT。
2024-02-17 12:33:33 1162 2
原创 实验五 用户进程管理-实验部分
由于进程的执行空间扩展到了用户态空间,且出现了创建子进程执行应用程序等与lab4有较大不同的地方,所以具体实现的不同主要集中在进程管理和内存管理部分。在内存管理部分,与lab4最大的区别是增加了用户态虚拟内存的管理。为了管理用户态的虚拟内存,需要对页表的内容进行扩展,能够把部分的物理内存映射成用户虚拟内存。如果某进程执行的过程中,CPU在用户态下执行,则可以访问本进程页表描述的用户态虚拟内存(如下代码的cr3),由于权限不够,不能访问内核态虚拟内存。
2023-12-24 14:54:53 220
原创 Lab5用户进程管理内存布局解析
关于用户进行内存布局,最重要的是代码段、数据段、调试段的符号地址。这些地址在链接器的控制下,给定symbols table。其中ENTRY(kern_entry)规定加载器的加载地址,其中. = 0xC0100000;规定bin/kernel的内存布局起始地址,其中symbol table中的地址顺序是依靠实际链接目标文件顺序。在bin/kernel中有三类数据段,分别是.rodata、.data、.bss。最让人分不清的是.data和.bss的区别。
2023-10-29 10:42:22 233
原创 实验四 内核线程管理-实验部分
进程是指具有一定独立功能的程序在一个数据集合上的一次动态执行过程。每一个进程都有它独立的main函数,独立的功能。每一个进程都在自己的内存空间执行,这个内存空间就是数据集合。每一个进程都在CPU上的一次动态执行,这个动态执行依靠的是进程在CPU上的并发执行。lab2和lab3完成了对内存的虚拟化,但整个控制流还是一条线串行执行。lab4将在此基础上进行CPU的虚拟化,即让ucore实现分时共享CPU,实现多条控制流能够并发执行。
2023-10-03 21:42:02 324
原创 实验六 调度器-实验部分
本章介绍调度器涉及的核心知识点以及进程调度器设计的目标进程的生命周期的角度看,、切换、退出属于操作系统课程的第5个实验的重要内容。本章继续从进程的生命周期角度出发,对进程调度进行设计与分析。
2023-07-29 21:43:32 1114
原创 实验八 文件系统-实验部分
针对ucore的实验八--文件系统,本文从两个方面进行详细的介绍。一是文件系统所涉及的核心知识点。二是针对实验,详细解读实验的如何设计和思考的。
2023-07-02 20:06:39 1476
原创 0、C语言中可变参数打印代码解读
可变参数打印使用C语言的同学都知道,C语言的打印函数printf();是可以打印可变参数的,比如:printf("hello world!My name is %s,I am %d years old\n","Jack",98);printf("hello world!My name is %s\n","Jack");对于计算机程序来说,总是一行行执行代码,对于C语言来说,可变参数是如何实现的呢?可变参数实现的知识点对于可变参数的实现,首先是函数调用栈的入栈顺序,以及基于栈的参数寻.
2022-04-22 19:31:15 3061
原创 -2、C++编译报错有迹可寻
1. 什么是编译1.1. 计算机程序设计语言的三个层次在计算机系统中,主要有三种层次的语言,他们是机器语言、汇编语言、高级语言。机器语言是可以被计算机理解的语言,计算机只能理解01二进制序列,但是机器语言特别难记。汇编语言在机器语言的基础上引入了助记符,方便记忆一些,但是要熟悉目标机器的指令特点,使用效率低,对人要求高。正是如此引用高级语言,高级语言采用类似数学定义或者自然语言的简洁形式,接近人的习惯并不依赖特定机器。图1 -1计算机程序设计语言的三个层次1.2. 三种语言的关系
2022-03-22 16:01:48 2875
原创 光刻工艺公开资料汇总:
[1]韦亚一,超大规模集成电路先进光刻理论与应用[M],科学出版社,2016[2]王向朝,集成电路与光刻机[M],科学出版社,2020[3]伍强,衍射极限附近的光刻工艺[M],清华大学出版社,2020[4]马科斯.波恩,光学原理(光的传播、干涉和衍射的电磁理论)(第7版)[M],电子工业出版社,2016[5]王向朝,光刻机像质检测技术(上下册)[M],科学出版社,2021[6]李金龙,ArF浸没光刻双工件台运动模型研究[D],中国科学院大学,2013[7]刘晓林,浸没式ArF光刻机物镜的光学设计
2022-02-13 18:35:49 2969 4
原创 -1、C++中容器存放堆内存动态数据
2.通过C++的拷贝构造函数,容器中的数据属于深拷贝,完成对象自动申请内存与自动释放内存。1.通过C++的析构函数,自动释放堆内存数据,达到内存自动释放的目的。3.通过重载赋值运算符,完成两个对象之间的赋值规则制定。
2021-12-29 23:18:04 971 2
原创 物理内存管理-ucore操作系统的PADDR宏
PADDR宏在pmm.c文件中的pmm_init(void)函数中会有如下奇怪的宏定义用法,以前从未见,PADDR完成了去除内核的虚拟起始地址,这个宏是如何工作的?
2021-03-14 16:09:10 640
原创 多线程-H2O生成
H2O生成现在有两种线程,氧 oxygen 和氢 hydrogen,你的目标是组织这两种线程来产生水分子。存在一个屏障(barrier)使得每个线程必须等候直到一个完整水分子能够被产生出来。氢和氧线程会被分别给予 releaseHydrogen 和 releaseOxygen 方法来允许它们突破屏障。这些线程应该三三成组突破屏障并能立即组合产生一个水分子。你必须保证产生一个水分子所需线程的结合必须发生在下一个水分子产生之前。换句话说:如果一个氧线程到达屏障时没有氢线程到达,它必须等候直到两个氢
2020-09-29 20:24:25 320
原创 多线程-打印零和奇偶数
打印零和奇偶数要求假设有这么一个类:class ZeroEvenOdd { public ZeroEvenOdd(int n) { ... } // 构造函数 public void zero(printNumber) { ... } // 仅打印出 0 public void even(printNumber) { ... } // 仅打印出 偶数 public void odd(printNumber) { ... } // 仅打印出 奇数}相同的一个 Ze
2020-09-28 23:09:28 807
原创 shell脚本两个文件关键行合并
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar
2020-08-19 20:15:19 3559
原创 缩短循环码BCH(26,16)编解码原理与二进制算法
1.BCH(26,16)的基本简介BCH(26,16)是一种缩短循环校验码,它的数据位为16位,校验位是10位,码字的长度为26位。BCH(26,16)码取(31,21)循环码中的前5位信息位为0的码字作为码字,构成(21-5)维的线性子空间,它最多能够纠正t=2位错误(,其中m是GF(p^m)中的m,这里的m=5,n=31,k=21)。对于铁路在800M频段上的数据业务,它采用的生成多项式为...
2018-11-29 13:39:31 14677 8
1、MS-DOS 6.2版本 2、磁盘挂载工具 3、镜像文件
2024-10-29
H.264视频字节流解析成NALU
2020-08-18
devicetree-specification-v0.2.pdf
2020-06-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人