- 博客(50)
- 资源 (3)
- 收藏
- 关注
原创 20、执行期类型识别
执行期类型识别:Runtime Type Identification,RTTI其中gen是 generic的简称,用来表现一个overloaded function。于是只要你有一个变量,或是类型type *的成员(并知道它代表一个函数),你就必须决定其特定的derived type是否为fct或是gen。在2.0 导入const member functions之前,conversion运算符不能够被overloaded,因为它们不使用参数。
2025-04-14 08:56:30
261
原创 19、Template
template是最令程序员挫败的一个主题,这一节的聚焦放在template的语意上面,我们将讨论templates在编译系统中“何时”、“为什么”以及“如何”发挥其功能。我们使用“实例化”来表示进程(process)将真正的类型和表达式绑定到template相关形式参数(formal parameters)上头。举个例子。
2025-03-14 09:06:04
993
原创 18、new和delete运算符
但事实上它是由两个步骤完成的:1)通过适当的new运算符函数实例,配置所需的内存://调用函数库中的new运算符2)将配置得来的对象设立初值:*pi = 5;更进一步地说,初始化操作应该在内存配置成功后才执行://new 运算符地两个分离步骤int *pi;*pi = 5;以constructor来配置一个class object,情况类似。例如:在这里,如果以new运算符配置object,而其constructor抛出一个exception,配置得来的内存就会被释放掉。
2025-03-02 15:43:12
316
原创 17、对象的构造和析构
下面是cfront的输出。2)类似情况,在每一个需要静态的内存释放操作(static dealllocation)的文件中,产生一个__std()函数(译注:我想std就是static deallocation的缩写),内含必要的destructor调用操作,或是其inline expansions。3)提供一组runtime library “munch”函数:一个_main()函数(用以调用可执行文件中的所有__sti()函数),以及一个exit()函数(以类似的方式调用所有的__std()函数)。
2025-02-26 08:44:13
906
原创 3、qtcreator和makefile项目一起使用
部分老项目的build系统是makefile,这些老项目在维护期间也需要IDE单步调试。本文介绍在Linux环境中qtcreator和makefile项目如何一起使用。
2025-01-24 13:57:50
373
1
原创 16、继承体系下的对象构造
当我们定义一个object如下:T object;在这里,不明显的是constructor的调用真正伴随了什么?Constructor可能含有大量的隐藏代码,因为每个编译器会扩充每一个constructor,扩充的程度视class T的继承体系而定。这一节中,我要从“C++语言对classes所保证的语意”这个角度,探讨constructor扩充的必要性,如下所示的代码。
2025-01-15 09:02:38
966
原创 15、无继承情况的对象构造
public:private:这个经过封装的Point class,其大小并没有改变,还是三个连续的float。是的,不论是private或public存取层,或是member function的声明,都不会占用额外的对象空间。
2024-12-30 08:45:54
589
原创 14、Inline Functions
理论上,一个比较干净的做法是使用inline函数来set和get函数由于我们受限只能在上述的两个函数中对_x直接存取,因此也就将稍后可能发生的data members的改变所带来的冲击最小化的。如果把这些存取函数声明为inline,我们就可以继续保持直接存取members的那种高效率---同时我们兼顾了函数的封装性。此外,加法运算符不再需要被声明为Point的一个friend。
2024-11-20 08:49:02
408
原创 13、指向Member Function的指针
或者和指向member function的指针声明语法,以及指向“member selection运算符”的指针,其作用是作为this指针的空间保留者。这也是为什么static member functions(没有this指针)的类型是“函数指针”,而不是“指向member function的指针”之故。
2024-11-14 08:56:04
491
原创 12、Virtual Member Functions
为了支持virtual function机制,必须首先能够对于多态对象有某种形式的“执行期类型判断(runtime type resolution)”。也就是说以下的调用操作需要ptr在执行期的某些关键信息。ptr->z();如此一来,才能够找到并调用z()的适当实例。或许最直接了当但是成本最高的解决方法是把必要的信息加在ptr身上。在这样的策略下,一个指针(或是一个reference)持有两项信息。它所参考的对象的地址对象类型的某种结构,用以正确决议出z()函数实例的地址。
2024-11-08 08:54:45
866
原创 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
642
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
751
原创 2. ZMQ不同样式的路由方式
1、ZMQ_REQclientserviceservicesserviceDirectionLast peerBlock2、ZMQ_REPDirectionLast peerzmq_sendDirectionBlockDirectionSee text在以上的字段,对于该socket处于bind()或者connect()状态,此时路由是什么效果呢?
2024-09-25 13:21:52
805
原创 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
486
原创 ZMQ专栏
在学习和使用ZMQ的过程中,记录ZMQ最精华的部分。我对ZMQ的本质理解是什么?即ZMQ定义了样式通信,这种样式通信又可以转换成数据收发(发送端和接收端),这种数据收发又可以转换成数据消息格式和路由。因此ZMQ的本质最终是数据消息格式和路由。
2024-09-25 08:17:25
129
原创 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
790
原创 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
184
原创 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
410
原创 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
263
原创 5、程序转换语意学
如果Point3d class声明一个或一个以上的virtual functions,或内含一个virtual base class,那么使用上述的函数将会导致那些“被编译器产生的内部members”的初值改写。把一个class object当作参数传给一个函数(或是作为一个函数的返回值),如下的代码要求局部的实例x0以memberwise的方式将xx当作初值。在编译器的实现技术上,有一种策略是导入临时性object,并调用copy constructor将它初始化,然后将此临时性object交给函数。
2024-09-05 08:48:27
537
原创 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
1138
原创 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
768
原创 1、 C++对象模型简介
为什么C++可以“自动完成”这么多事情,多态的底层实现是什么样子的,理解了C++的对象模型后,可以写出比较没有错误且比较有效的代码。
2024-08-02 08:57:52
1038
原创 ucoreOS操作系统博客导航栏
跟着清华大学的学堂在线公开课,对操作系统的原理和实验有了更加深刻的理解。回顾自己2年来从不懂实验的基本的宏定义,到能用预编译指令展开宏,从代码深奥无比,支离破碎的理解,到能全局的理解一个或多个实验。其中最值得肯定的是走了一条正确的道路,即理论加实验学习,尤其提高实验的投入时间。其次,清华大学的操作系统学习是一门十分的系统课程,有利于提高系统思维。
2024-04-03 07:50:13
592
原创 实验二 物理内存管理-实验部分
在X86系统中,正好支持分段和分页这两种机制。将逻辑地址转换成线程地址空间的过程,称为分段,而将线性地址转换成物理地址空间的过程称为分页。分段和分页的过程如下图所示。图3-1 分段和分页分段提供一种划分处理器地址内存空间成更小的保护地址空间,这种地址空间称为段。段可以用来维持一个程序的代码、数据、堆栈。或者用来维持一个系统的数据结构,如TSS、LDT。
2024-02-17 12:33:33
1213
2
原创 实验五 用户进程管理-实验部分
由于进程的执行空间扩展到了用户态空间,且出现了创建子进程执行应用程序等与lab4有较大不同的地方,所以具体实现的不同主要集中在进程管理和内存管理部分。在内存管理部分,与lab4最大的区别是增加了用户态虚拟内存的管理。为了管理用户态的虚拟内存,需要对页表的内容进行扩展,能够把部分的物理内存映射成用户虚拟内存。如果某进程执行的过程中,CPU在用户态下执行,则可以访问本进程页表描述的用户态虚拟内存(如下代码的cr3),由于权限不够,不能访问内核态虚拟内存。
2023-12-24 14:54:53
252
原创 Lab5用户进程管理内存布局解析
关于用户进行内存布局,最重要的是代码段、数据段、调试段的符号地址。这些地址在链接器的控制下,给定symbols table。其中ENTRY(kern_entry)规定加载器的加载地址,其中. = 0xC0100000;规定bin/kernel的内存布局起始地址,其中symbol table中的地址顺序是依靠实际链接目标文件顺序。在bin/kernel中有三类数据段,分别是.rodata、.data、.bss。最让人分不清的是.data和.bss的区别。
2023-10-29 10:42:22
255
原创 实验四 内核线程管理-实验部分
进程是指具有一定独立功能的程序在一个数据集合上的一次动态执行过程。每一个进程都有它独立的main函数,独立的功能。每一个进程都在自己的内存空间执行,这个内存空间就是数据集合。每一个进程都在CPU上的一次动态执行,这个动态执行依靠的是进程在CPU上的并发执行。lab2和lab3完成了对内存的虚拟化,但整个控制流还是一条线串行执行。lab4将在此基础上进行CPU的虚拟化,即让ucore实现分时共享CPU,实现多条控制流能够并发执行。
2023-10-03 21:42:02
345
原创 实验六 调度器-实验部分
本章介绍调度器涉及的核心知识点以及进程调度器设计的目标进程的生命周期的角度看,、切换、退出属于操作系统课程的第5个实验的重要内容。本章继续从进程的生命周期角度出发,对进程调度进行设计与分析。
2023-07-29 21:43:32
1196
原创 实验八 文件系统-实验部分
针对ucore的实验八--文件系统,本文从两个方面进行详细的介绍。一是文件系统所涉及的核心知识点。二是针对实验,详细解读实验的如何设计和思考的。
2023-07-02 20:06:39
1544
原创 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
3185
原创 -2、C++编译报错有迹可寻
1. 什么是编译1.1. 计算机程序设计语言的三个层次在计算机系统中,主要有三种层次的语言,他们是机器语言、汇编语言、高级语言。机器语言是可以被计算机理解的语言,计算机只能理解01二进制序列,但是机器语言特别难记。汇编语言在机器语言的基础上引入了助记符,方便记忆一些,但是要熟悉目标机器的指令特点,使用效率低,对人要求高。正是如此引用高级语言,高级语言采用类似数学定义或者自然语言的简洁形式,接近人的习惯并不依赖特定机器。图1 -1计算机程序设计语言的三个层次1.2. 三种语言的关系
2022-03-22 16:01:48
2928
原创 光刻工艺公开资料汇总:
[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
3090
4
原创 -1、C++中容器存放堆内存动态数据
2.通过C++的拷贝构造函数,容器中的数据属于深拷贝,完成对象自动申请内存与自动释放内存。1.通过C++的析构函数,自动释放堆内存数据,达到内存自动释放的目的。3.通过重载赋值运算符,完成两个对象之间的赋值规则制定。
2021-12-29 23:18:04
1001
2
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关注的人