- 博客(32)
- 收藏
- 关注
原创 进程的执行过程
我们可以将计算机科学中的进程概念与农业中玉米的种植过程联系起来。在这个比喻里,我们可以看到进程的生命周期、资源分配以及状态管理等核心概念是如何通过自然界的生长现象来解释的。
2024-12-22 09:00:09
432
原创 深度理解协程
协程(Coroutine)是一种编程构造,它允许函数在执行过程中暂停并在之后恢复,从而实现非抢占式的多任务处理。与传统的子程序不同,协程可以在执行中途挂起,并且可以从挂起点继续执行,而不是像子程序那样遵循严格的调用和返回模式。这种特性使得协程非常适合用于需要长时间等待的操作,比如I/O操作,因为它可以在等待期间让出控制权给其他任务,而不会阻塞整个线程或进程。
2024-12-20 02:03:21
666
原创 vector的capacity和size
可见当vector的capacity不足时,则在原有vector基础上扩容,扩容后capacity变为原来的两倍。
2024-12-07 10:49:43
185
原创 创建空向量:std::vector<int> v,刚创建时大小为0
此外,值得注意的是,虽然刚开始时v.size()为0,但你可以随时调用reserve()函数来为向量预留一定的容量,这样可以在一定程度上优化性能,尤其是在你预见到未来将要插入大量元素的情况下。不过,请记住,即使指定了容量,实际的元素数量仍然是由size()决定的,只有当真正插入了元素之后,size()才会相应增加。总之,创建一个空的std::vector<int> v是一种常见且有效的做法,它允许我们在不知道确切元素数量的情况下开始工作,并且可以根据需要灵活地调整向量的内容和大小。
2024-12-06 22:02:28
205
原创 c++双端队列std::deque
在C++中,std::deque(双端队列)是一种特别设计的数据结构,它允许高效地在容器的两端进行插入和删除操作。为了实现这一特性,std::deque采用了分段存储的方式来进行内存管理。下面我们将详细解释其内存分配方式以及为什么选择这种方式。
2024-12-06 21:24:05
948
原创 c++ auto
在C++中,auto是一种类型推导关键字,它允许编译器根据初始化表达式的类型自动推导变量的类型。自 C++11 标准引入以来,auto使得代码更加简洁,并且可以减少冗长的类型声明,尤其是在类型名称非常复杂或难以立即确定的情况下。以下是关于auto。
2024-12-06 20:41:49
761
原创 .py文件的内置属性
Python 源码文件(.py 文件)是包含 Python 代码的文本文件,它们在 Python 编程中扮演着核心角色。每个 .py 文件都可以被视作一个模块,这些模块可以单独运行或作为更大项目的一部分被导入和使用。下面将详细介绍 .py 文件的一些重要属性。
2024-12-04 22:30:03
474
原创 sys.path
sys.path是 Python 中一个非常重要的属性,它是一个列表,包含了 Python 解释器在导入模块时需要查找的目录路径。当您使用import语句来加载一个模块时,Python 解释器会按照sys.path列表中的顺序依次查找对应的模块文件,直到找到为止。如果找到了该模块文件,则可以成功导入;如果没有找到,则会抛出错误。
2024-12-04 22:10:47
513
原创 Python虚拟环境实际创建过程
一个Python虚拟环境本质上是对Python运行所需组件的引用和部分拷贝相结合的结果。具体来说,当创建一个新的虚拟环境时,它并不是完全复制整个Python安装,而是通过一系列机制来确保每个虚拟环境可以独立运作,同时尽量减少磁盘空间占用。
2024-12-04 21:59:59
461
原创 c++杂七杂八的知识点
一旦定义了自定义构造函数,编译器就不会再自动生成默认构造函数。如果你希望两者都存在,就需要显式地声明默认构造函数。int id;// 显式声明默认构造函数// 自定义构造函数这样做可以确保即使有自定义构造函数的情况下,仍然可以创建未初始化的对象。
2024-12-04 09:37:18
167
原创 为什么ACK总是1
在TCP连接建立之后,发送方在发送数据报文时,ACK标志位通常是1。这是为了确认之前接收到的数据,确保数据的可靠传输。只有在最初的SYN报文中(用于建立连接请求)才会设置ACK为0。
2024-11-25 13:28:28
560
原创 SR协议发送窗口的管理
在SR协议中,发送方每收到一个ACK,都会确认相应的数据包。如果某个数据包未被确认(如数据包3),发送窗口不能向前滑动,直到该数据包被确认。因此,当发送方收到ACK4时,尽管数据包4已被确认,但由于数据包3尚未确认,发送窗口不能向前滑动。只有当数据包3被确认后,发送窗口才能继续向前滑动。
2024-11-23 16:16:21
508
原创 栈的应用表达式求值
(1).若ch优先级大于OPTR栈顶元素,ch为‘(’,将ch压入OPTR中,读取下一个字符。d.重复上面a,b,c的操作,直至遇到‘(’,弹出'(',然后回到第2步。a.从OPTR栈中弹出栈顶的操作符,c.计算数值,将结果压如OPND栈,a.从OPTR栈中弹出栈顶的操作符,c.计算数值,将结果压如OPND栈,b.从OPND栈中弹出两个操作数,b.从OPND栈中弹出两个操作数,1.创建两个栈,OPTR用于存放运算符,OPND用于存放操作数。表示式为字符形式,格式为“#{表达式}#”。
2024-11-20 11:37:29
235
原创 源程序文件到可执行程序的详细过程
1.静态链接静态链接的过程涉及将多个目标文件(.o或.obj文件)以及库文件合并成一个单独的可执行文件,它的工作方式不是简单地将某个文件的数据段加入到另一个文件中。输入文件准备链接器接收一个或多个目标文件(.o或.obj文件),这些是从源代码文件(如.c或.cpp文件)经过编译和汇编后生成的。如果程序中使用了标准库或其他静态库,链接器也会接收这些库文件(通常是.a或.lib文件)。符号解析每个目标文件都包含了代码段(文本段)、数据段以及未解析的符号表。
2024-11-14 13:01:33
974
原创 本地 DNS 解析器、本地 DNS 服务器“(Local DNS Server)、远程 DNS 服务器“(Remote DNS Server)
在 DNS 系统中,"本地 DNS 解析器"、"本地 DNS 服务器"(Local DNS Server)和"远程 DNS 服务器"(Remote DNS Server)是三个不同的概念,它们在 DNS 查询过程中扮演不同的角色。下面详细解释这三个概念及其区别:定义:功能:位置:定义:功能:配置:定义:类型:功能:
2024-11-04 00:00:25
1058
原创 c++stream流
流作为对象:流是C++标准库中定义的类对象,具有自己的状态和行为。作用域和生命周期:流对象的生命周期与其作用域相同,遵循C++对象的一般规则。赋值和操作:流对象可以像其他对象一样进行赋值和操作,支持多种方法和运算符。状态和错误处理:流对象维护内部状态,可以通过方法检查和处理错误。
2024-11-02 23:25:33
529
原创 c++常见输入函数
类的一个成员函数,用于从标准输入流中读取一行字符,直到遇到换行符或达到指定的最大字符数。这个函数通常用于读取用户输入的一行文本,并且可以处理包含空格的字符串。它从输入流中读取一行字符,并将其存储在一个字符数组中。在这个示例中,程序会提示用户输入一行字符,最多可以输入 99 个字符(不包括终止空字符。在这个示例中,程序首先读取一个字符,然后读取一行字符,并将它们分别输出到屏幕上。在这个示例中,程序会持续读取多行字符,直到用户输入。在这个示例中,程序会读取一行字符,直到遇到分号。类的一个成员函数,定义在。
2024-11-02 12:29:55
807
原创 HTTP协商缓存和强制缓存
强制缓存:当资源的缓存时间未过期时,浏览器直接从缓存中读取资源,不向服务器发送请求。协商缓存:当资源的缓存时间过期时,浏览器向服务器发送带有缓存验证信息的请求,服务器根据资源是否已更新决定返回 304 Not Modified 还是新的资源。初始请求和响应:浏览器首次请求资源,服务器返回资源及其缓存控制信息。协商缓存请求:缓存时间过期后,浏览器发送带有缓存验证信息的请求。协商缓存响应:资源未修改,浏览器继续使用缓存中的资源。200 OK:资源已修改,服务器返回新的资源。
2024-10-31 21:51:54
1647
原创 KMP算法详解(c++实现)
目的:在文本串S中查找一个模式串P,并返回模式串P在文本串S中的位置。思想:利用模式串P本身的性质,消除重复的比较。在BF算法中,逐个字符地比较模式串和文本串中的相应部分,我们会得到一个模式串的子串刚好与文本串匹配。BF算法的下一步是回溯到文本串上次比较的起始位置;而KMP算法则不需要回到起始位置。而是根据子串中开头与结尾字符重复的部分,让文本串比较的起始点从子串开头重复在文本串中的对应位置(前缀)移动至子串结尾重复在文本串中的对应位置(后缀)。最终使算法复杂度从O(m*n)减少到O(m+n)
2024-10-30 10:52:00
1692
1
原创 析构函数可以而且经常被声明为虚函数;构造函数一定不能是虚函数
这样做是为了确保当使用基类指针删除派生类对象时,能够正确地调用派生类的析构函数。如果没有将基类的析构函数声明为虚函数,那么在这种情况下只会调用基类的析构函数,而不会调用派生类的析构函数,这可能导致派生类特有的资源没有得到适当的释放,从而引发资源泄漏或其他未定义行为。析构函数可以而且经常被声明为虚函数,特别是在基类中。当一个类被设计为基类,并且该基类的对象可能会通过指向派生类对象的基类指针(或引用)来删除时,将析构函数声明为虚函数是非常重要的。的析构函数,然后自动调用。的析构函数会被调用,
2024-10-28 00:34:28
195
原创 c++虚函数表
在C++中,虚函数(virtual functions)是一种支持多态(polymorphism)的机制。当一个基类中的成员函数被声明为虚函数时,它可以在派生类中被重写(override),并且通过基类指针或引用调用该函数时,实际执行的是派生类中的版本。为了实现这一机制,编译器会使用一种称为“虚函数表”(vtable)的数据结构。
2024-10-27 21:23:25
406
原创 c++中对象组合
首先,我们定义一些简单的类,如NameAddressHealthPlan和Raise// 姓名类private:public:// 地址类private:public:// 健康计划类private:public:// 提升类private:public:接下来,我们定义Employee类,它将包含上述类的对象或引用。这里我们会展示两种方式:完全包含(作为成员)和通过引用包含。// 员工类private:Name name;// 完全包含。
2024-10-27 20:28:39
214
原创 c++初始化列表与构造函数的关系
在C++中,初始化列表和构造函数是对象创建过程中非常重要的两个概念。它们共同作用于类的实例化过程,但各自有不同的用途和特点。初始化列表是在构造函数开始执行之前对成员变量进行初始化的一种机制。它位于构造函数的参数列表之后,冒号之后的一系列初始化操作。使用初始化列表可以提高效率,特别是对于那些没有默认构造函数的成员(如常量、引用)或者需要调用特定构造函数的情况。优点性能:直接初始化成员变量通常比先默认初始化再赋值要高效。 必要性:对于某些类型的成员,比如或引用类型,必须使用初始化列表来初始化,因为这
2024-10-27 20:02:49
337
原创 c/c++中的字符串
字符常量定义:一个字符常量是由一对单引号括起来的单个字符。示例'A''1''\n'注意:字符常量实际上是整数值,代表该字符在计算机字符集(如ASCII或Unicode)中的编码。字符数组定义:字符数组是一系列连续存储的字符,最后一个元素通常是空字符\0作为字符串的结束标志。声明或者特点:可以逐个访问和修改每个字符;大小需要预先确定;适合处理固定长度的文本。字符串变量(使用 C 风格字符串字符串常量是编译时常量,存储在只读内存中。使用来指向C风格字符串常量。
2024-10-27 13:54:17
983
原创 C++在函数定义时传入数组的方式
1.通过指针和数组大小作为参数更进一步,如果我们不需要改变数组的值,最好把指针设置为指向const类型,即const int * arr。2.通过&传入这里有一个例子展示了如何定义一个接受数组引用作为参数的函数:在这个例子中,函数接受一个对长度为5的整数数组的引用以及数组的大小。由于数组的大小是固定的(在本例中为5),所以在函数内部我们可以进行一些简单的验证来确保传入的size参数与数组的实际大小相匹配。这种方法的一个缺点是在这个例子中,printArray函数接受一个数组引用作为参数。注意这里的。
2024-10-26 09:33:33
2586
原创 c++中this指针
在C++中,this指针是一个隐含的指针,它指向当前对象实例。当一个成员函数被调用时,this指针会自动传递给该函数,使得成员函数能够访问和操作调用它的对象的数据成员。this。
2024-10-13 11:44:45
459
原创 c/c++中函数的默认参数
这意味着如果调用函数时没有为某些参数提供实际的参数值,那么将使用在函数声明或定义中指定的默认值。默认参数使得函数更加灵活,因为它们允许你省略一些参数。注意,在这个例子中,我们把默认参数放在了函数声明中,而不是定义中。这是推荐的做法,尤其是在函数可能被多次声明的情况下(例如在不同的源文件中)。也就是说,一旦一个参数被赋予了默认值,那么它右边的所有参数都必须也有默认值,除非在调用函数时提供了这些参数的具体值。通常的做法是在头文件中的函数声明处指定默认参数,这样可以使接口更加清晰。
2024-10-13 10:33:31
217
原创 C++中的三种继承方式
公有继承:最常用的继承方式,用于实现“是一个”关系,允许派生类公开基类的公共接口。保护继承:用于实现“被一个”关系,隐藏基类的公共接口,但允许派生类内部访问。私有继承:用于实现“使用一个”关系,完全隐藏基类的接口,只允许派生类内部访问。
2024-10-10 00:06:26
863
1
原创 虚基类的继承机制
总结来说,当一个派生类通过多个路径虚继承同一个基类时,最底层的派生类必须在其构造函数初始化列表中显式调用虚基类的构造函数。只有虚基类没有显示的构造函数时,最终继承者的构造函数的初始化列表才不用写该虚基类的构造函数,但调用顺序依然是最上层的虚基类最先调用,即使它是编译器生成的默认构造函数。这是因为在虚继承的情况下,虚基类只有一个实例,而这个实例必须由最底层的派生类来负责初始化。中显式调用虚基类的构造函数,编译器将无法确定如何初始化这个唯一的虚基类实例,从而导致编译错误。的构造函数初始化列表中,必须显式调用。
2024-10-10 00:00:54
147
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人