<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ProcedureStone的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/ProcedureStone</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ProcedureStone]]></copyright><item><title><![CDATA[【设计模式】创建型 -- 单例模式 （c++实现）]]></title><link>https://blog.youkuaiyun.com/ProcedureStone/article/details/143316324</link><guid>https://blog.youkuaiyun.com/ProcedureStone/article/details/143316324</guid><author>ProcedureStone</author><pubDate>Tue, 08 Apr 2025 20:17:41 +0800</pubDate><description><![CDATA[在C++11 推出以前，局部静态变量的方式实现单例存在线程安全问题，所以部分人提出了一种方案，就是在主线程启动后，其他线程没有启动前，由主线程先初始化单例资源，这样其他线程获取的资源就不涉及重复初始化的情况了。当一个函数中定义一个局部静态变量，那么这个局部静态变量只会初始化一次，就是在这个函数第一次调用的时候，以后无论调用几次这个函数，函数内的局部静态变量都不再初始化。分配到内存后，new 操作会在刚刚分配的内存上调用对象的构造函数，初始化该对象的各个成员。即c++规定各厂商优化编译器，能保证线程安全。]]></description><category></category></item><item><title><![CDATA[【Qt 01】cmake搭建Qt VS2019开发环境]]></title><link>https://blog.youkuaiyun.com/ProcedureStone/article/details/146480332</link><guid>https://blog.youkuaiyun.com/ProcedureStone/article/details/146480332</guid><author>ProcedureStone</author><pubDate>Tue, 25 Mar 2025 10:18:13 +0800</pubDate><description><![CDATA[PDB文件（Program Database File）是Microsoft Visual Studio编译生成的调试信息文件，主要用于存储程序的符号信息（如函数名、变量名、行号等），使调试器能将机器代码与源代码对应，从而辅助开发人员定位问题。（如果打开失败，原因估计是找不到Qt Desinger，右键 --> 打开方式，自己配置一个Qt Desinger，这里是Qt Desinger需要自己去官网或其他地方下载）在开发过程中，如果想通过断点进入到 qt 源码中，我们可以配置pdb文件。]]></description><category></category></item><item><title><![CDATA[【C++】类型转换]]></title><link>https://blog.youkuaiyun.com/ProcedureStone/article/details/143582163</link><guid>https://blog.youkuaiyun.com/ProcedureStone/article/details/143582163</guid><author>ProcedureStone</author><pubDate>Wed, 06 Nov 2024 23:33:38 +0800</pubDate><description><![CDATA[RTTI 使得你可以查询对象的动态类型（即对象在运行时的实际类型），并在多态的情况下执行类型转换。在 C++ 中，虚函数表（vtable）与 RTTI 密切相关，因此只有包含虚函数的类才能启用 RTTI。这四种转换方式提供了强类型检查的转换机制，分别适用于不同场景，避免了 C 风格转换的隐患。在C语言中，如果赋值运算符左右两侧类型不同，或者形参与实参类型不匹配，或者返回值类型与。RTTI 允许你在运行时检查对象的实际类型，特别是在使用基类指针或引用时。对象，可以用于比较类型或获取类型的名字。]]></description><category></category></item><item><title><![CDATA[【算法】排序算法总结]]></title><link>https://blog.youkuaiyun.com/ProcedureStone/article/details/143377571</link><guid>https://blog.youkuaiyun.com/ProcedureStone/article/details/143377571</guid><author>ProcedureStone</author><pubDate>Wed, 30 Oct 2024 23:42:49 +0800</pubDate><description><![CDATA[排序方法时间复杂度空间复杂度稳定性平均情况最坏情况最好情况直接插入排序O(n2n^2n2O(n2n^2n2O(nnnO(1)稳定折半插入排序O(n2n^2n2O(n2n^2n2O(nnnO(1)稳定希尔排序O(n1.3n^{1.3}n1.3O(1)不稳定简单选择排序O(n2n^2n2O(n2n^2n2O(n2n^2n2O(1)不稳定堆排序O(nlog2nnlog_2{n}nlog2​nO(n。]]></description><category></category></item><item><title><![CDATA[【问题】栈区地址分配之谜：为什么局部变量的地址会递增？]]></title><link>https://blog.youkuaiyun.com/ProcedureStone/article/details/143377211</link><guid>https://blog.youkuaiyun.com/ProcedureStone/article/details/143377211</guid><author>ProcedureStone</author><pubDate>Wed, 30 Oct 2024 23:15:06 +0800</pubDate><description><![CDATA[在大多数操作系统中，进程的栈是向下增长的。这意味着栈的起始地址通常是高地址，而随着数据的推入（如函数调用、局部变量等），栈指针会向低地址移动。这种设计有助于栈和堆之间的空间利用，因为堆是向上增长的。，当我们调用函数时，栈区会开辟一块空间给函数使用。而函数内的局部变量是在函数栈帧中开辟空间。怎么linux栈区的地址是向上增长的呢？]]></description><category></category></item><item><title><![CDATA[【数据结构】树（堆、哈夫曼树、二叉排序树、AVL树、）（更新中....）]]></title><link>https://blog.youkuaiyun.com/ProcedureStone/article/details/143376076</link><guid>https://blog.youkuaiyun.com/ProcedureStone/article/details/143376076</guid><author>ProcedureStone</author><pubDate>Wed, 30 Oct 2024 22:53:33 +0800</pubDate><description><![CDATA[但是如果要对AVL树做一些结构修改的操作，性能非常低下，比如：插入时要维护其绝对平衡，旋转的次数比较多，更差的是在删除时，有可能一直要让旋转持续到根的位置。若二叉树中最多只有最下面两层的结点的度数可以小于2,并且最下面一层的叶子结点都依次排列在该层最左边的位置上，则这样的二叉树称为完全二叉树(complete binary tree)注意：由于变化前C的平衡因子不一定为0，可能是0，-1，1，3种情况下，A,B的最终平衡因子有所不同。插入某个节点后，如果该节点的父节点的平衡因子==0，则它的爷爷一定平衡。]]></description><category></category></item><item><title><![CDATA[【C++】结构体、enum、union回顾]]></title><link>https://blog.youkuaiyun.com/ProcedureStone/article/details/143357900</link><guid>https://blog.youkuaiyun.com/ProcedureStone/article/details/143357900</guid><author>ProcedureStone</author><pubDate>Wed, 30 Oct 2024 11:39:35 +0800</pubDate><description><![CDATA[怎样即节省空间又节省时间呢？- 调整变量顺序/修改默认对齐数。]]></description><category></category></item><item><title><![CDATA[【C++】C++11]]></title><link>https://blog.youkuaiyun.com/ProcedureStone/article/details/143230049</link><guid>https://blog.youkuaiyun.com/ProcedureStone/article/details/143230049</guid><author>ProcedureStone</author><pubDate>Fri, 25 Oct 2024 11:26:52 +0800</pubDate><description><![CDATA[RAII的做法是使用一个对象，在其构造时获取对应的资源，在对象生命期内控制对资源的访问，使之始终保持有效，最后在对象析构的时候，释放构造时获取的资源。在C++98中auto是一个存储类型的说明符，表明变量是局部自动存储类型，但是局部域中定义局部的变量默认就是自动存储类型，所以auto就没什么价值了。在对象构造时获取资源，接着控制对资源的访问使之在对象的生命周期内始终保持有效，最后在对象析构的时候释放资源。如果p1是将亡值，这没什么问题，但p1不一定是将亡值，可能是左值，不能随便的转移资源。]]></description><category></category></item><item><title><![CDATA[【linux系统】文件系统]]></title><link>https://blog.youkuaiyun.com/ProcedureStone/article/details/136306707</link><guid>https://blog.youkuaiyun.com/ProcedureStone/article/details/136306707</guid><author>ProcedureStone</author><pubDate>Wed, 16 Oct 2024 13:39:12 +0800</pubDate><description><![CDATA[通过上面的例子可以看出：test.txt的inode(1050440)与hard_link的inode(1050440)相同，而我们知道，每个文件的inode是唯一的，因此可以推断hard_link不是一个独立的文件，反之，soft_link是一个独立的文件，因为它有独立的inode.假如我们删去test.txt，与文件inode:105040的文件名减少一个，因此引用计数减1，由2变为1，因此下方hard_link前面的数字变为1。它是一个权限的反向屏蔽值，掩码中的位会关闭（去除）文件或目录的默认权限。]]></description><category></category></item><item><title><![CDATA[【linux网络】传输层]]></title><link>https://blog.youkuaiyun.com/ProcedureStone/article/details/142450736</link><guid>https://blog.youkuaiyun.com/ProcedureStone/article/details/142450736</guid><author>ProcedureStone</author><pubDate>Mon, 14 Oct 2024 10:01:05 +0800</pubDate><description><![CDATA[虽然TCP有了滑动窗口这个大杀器, 能够高效可靠的发送大量的数据. 但是如果在刚开始阶段就发送大量的数据, 仍然可能引发问题. 因为网络上有很多的计算机, 可能当前的网络状态就已经比较拥堵. 在不清楚当前网络状态下, 贸然发送大量的数据,是很有可能引起雪上加霜的. 因此TCP引入了。**序号的增长是根据发送的数据量而定的，每发送一个字节，序号就增加一个。6位标志位:TCP报文是有类型的，比如一个TCP报文可能是通信报文，也可以是建立连接的报文，也可以是关闭连接的报文，因此需要用标志来区分。]]></description><category></category></item><item><title><![CDATA[【linux系统】进程（进程PCB + 进程地址空间+进程控制）]]></title><link>https://blog.youkuaiyun.com/ProcedureStone/article/details/142786072</link><guid>https://blog.youkuaiyun.com/ProcedureStone/article/details/142786072</guid><author>ProcedureStone</author><pubDate>Fri, 11 Oct 2024 18:49:56 +0800</pubDate><description><![CDATA[僵尸进程虽然不会直接对系统造成严重影响，但长时间存在的僵尸进程会对系统的正常运行产生一些间接的危害，包括：可能导致资源耗尽，影响进程管理，降低系统稳定性。这样，当nice值为负值的时候，那么该程序将会优先级值将变小，即其优先级会变高，则其越快被执行所以，调整进程优先级，在Linux下，就是调整进程nice值。子进程更改数据后，会发生写时拷贝，因此子进程和父进程的g_val值不一样，符合预期，但是为什么发生了写时拷贝，父子进程的g_val地址还是相同？僵尸进程是子进程结束，但父进程未结束。]]></description><category></category></item><item><title><![CDATA[【linux网络】socket编程(TCP/UDP)]]></title><link>https://blog.youkuaiyun.com/ProcedureStone/article/details/137329313</link><guid>https://blog.youkuaiyun.com/ProcedureStone/article/details/137329313</guid><author>ProcedureStone</author><pubDate>Sat, 13 Apr 2024 14:59:32 +0800</pubDate><description><![CDATA[在函数内部，函数会解析local的前2个字节，如果是AF_INET就表示使用IPv4的网络通信，如果AF_UNIX就表示使用本地通信。当客户端调用 socket() 函数创建套接字时，操作系统会为该套接字分配一个未使用的端口号（通常是一个临时端口号），并在后续的通信过程中，该端口号会被动态地绑定到套接字上。连接的可靠性是有代价的，需要维护可靠性，这意味TCP更复杂，而不可靠意味UDP很简单。sin_addr的类型是in_addr的结构体，地址保存在in_addr的成员s_addr中，使用时要注意。]]></description><category></category></item><item><title><![CDATA[【linux系统】线程（线程TCB+线程同步和互斥+线程安全）]]></title><link>https://blog.youkuaiyun.com/ProcedureStone/article/details/137089540</link><guid>https://blog.youkuaiyun.com/ProcedureStone/article/details/137089540</guid><author>ProcedureStone</author><pubDate>Tue, 02 Apr 2024 11:26:35 +0800</pubDate><description><![CDATA[需要注意的是，__thread 关键字是 GCC 的扩展语法，虽然在大多数情况下可以正常工作，但并不是 C 标准的一部分，因此在一些不支持 GCC 扩展语法的编译器中可能无法使用。在 C11 标准中引入了 _Thread_local 关键字，用于实现线程局部存储，具有类似的功能，而且是标准化的语法。]]></description><category></category></item><item><title><![CDATA[【linux系统】环境变量]]></title><link>https://blog.youkuaiyun.com/ProcedureStone/article/details/136914047</link><guid>https://blog.youkuaiyun.com/ProcedureStone/article/details/136914047</guid><author>ProcedureStone</author><pubDate>Thu, 21 Mar 2024 19:27:00 +0800</pubDate><description><![CDATA[环境变量是操作系统中存储的一组键值对，用于指定进程的运行环境。每个进程都会继承父进程的环境变量，并可以在此基础上进行修改或扩展。环境变量通常包含了诸如路径、默认编辑器、语言设置等信息不同的环境变量有不同的用户，通常有全局属性。在linux系统中，使用命令env可以查看环境变量某些环境变量的意义PATH:linux下的默认指令搜索路径路径与路径之间使用分隔我们日常定义的程序，运行时需要./, 而像ls却不需要加上./，原因就在于PATH，ls的路径存储在PATH变量里面，即/usr/bin。]]></description><category></category></item><item><title><![CDATA[【linux】进程1 -- 状态和优先级]]></title><link>https://blog.youkuaiyun.com/ProcedureStone/article/details/136661707</link><guid>https://blog.youkuaiyun.com/ProcedureStone/article/details/136661707</guid><author>ProcedureStone</author><pubDate>Thu, 21 Mar 2024 16:48:24 +0800</pubDate><description><![CDATA[它的作用是创建一个与当前进程几乎完全相同的子进程，这个子进程有着与父进程相同的代码、数据和上下文，但是有着独立的内存空间。僵尸进程虽然不会直接对系统造成严重影响，但长时间存在的僵尸进程会对系统的正常运行产生一些间接的危害，包括：可能导致资源耗尽，影响进程管理，降低系统稳定性。这样，当nice值为负值的时候，那么该程序将会优先级值将变小，即其优先级会变高，则其越快被执行所以，调整进程优先级，在Linux下，就是调整进程nice值。linux下，我们使用的命令，如ls等，运行起来就是一个进程。]]></description><category></category></item><item><title><![CDATA[【linux系统】进程间通信1--管道]]></title><link>https://blog.youkuaiyun.com/ProcedureStone/article/details/136691343</link><guid>https://blog.youkuaiyun.com/ProcedureStone/article/details/136691343</guid><author>ProcedureStone</author><pubDate>Mon, 18 Mar 2024 20:55:55 +0800</pubDate><description><![CDATA[在多任务操作系统中，不同的进程可能同时运行，它们之间可能需要进行数据共享、协作完成某项任务等操作，这就需要进程间通信。对于一个文件，我们普遍印象如下图，进程打开文件，通过写(读)操作，写入(读取）文件缓冲区，再由文件缓冲区刷新到磁盘里。上面讲到的匿名管道应用于具有血缘关系的管道，如果我们要让俩个不相干的进程进行通信，就要使用命名管道。管道是Unix中最古老的进程间通信的形式，所谓的“管道”，指的是从一个进程连接到另一个进程的一个。命名管道和匿名管道的性质一样，是一种特殊的文件形式，不存储数据，只传递数据。]]></description><category></category></item><item><title><![CDATA[【linux系统】动静态库]]></title><link>https://blog.youkuaiyun.com/ProcedureStone/article/details/136601270</link><guid>https://blog.youkuaiyun.com/ProcedureStone/article/details/136601270</guid><author>ProcedureStone</author><pubDate>Mon, 11 Mar 2024 19:43:49 +0800</pubDate><description><![CDATA[在这个目录下，可以放置一系列以 .conf 结尾的文件，这些文件包含了动态链接器的库文件搜索路径配置。此时我们用ldd命令来查看，会看到not found,找不到库，可我们明明已经告诉编译器库在哪里，为什么还是找不到？当程序运行时，dy.so会被加载到内存里，然后通过页表，映射到进程1和进程2的进程地址空间里的。原因是你只告诉了.h的路径，并没有告诉.a文件的路径.静态库：程序在编译链接的时候把库的代码链接到可执行文件中。动态库：程序在运行的时候才去链接动态库的代码，多个程序共享使用库的代码。]]></description><category></category></item><item><title><![CDATA[【C++】面向对象的三大性质——多态，从使用到底层。]]></title><link>https://blog.youkuaiyun.com/ProcedureStone/article/details/133216393</link><guid>https://blog.youkuaiyun.com/ProcedureStone/article/details/133216393</guid><author>ProcedureStone</author><pubDate>Tue, 26 Sep 2023 12:03:09 +0800</pubDate><description><![CDATA[多态的概念：通俗来说，就是多种形态，具体点就是去完成某个行为，当不同的对象去完成时会产生出不同的状态。举例：对于买票的这个行为来说，成年人买票全价，儿童买票半价，学生买票打折，军人优先买票……不同的人虽然都是进行买票的行为，但买票过程的细节不完全相同。而为了让不同的对象，进行同一行为，产生不同的状态。我们则需要采用面向对象的三大特性之一：多态。Student st;//普通人买票ppn = &st;//学生买票。]]></description><category></category></item><item><title><![CDATA[【多态】虚函数表存储在哪个区域？]]></title><link>https://blog.youkuaiyun.com/ProcedureStone/article/details/133249520</link><guid>https://blog.youkuaiyun.com/ProcedureStone/article/details/133249520</guid><author>ProcedureStone</author><pubDate>Sun, 24 Sep 2023 19:44:50 +0800</pubDate><description><![CDATA[思路：比较虚函数表内存储的地址与其他存储区域的地址进行对比，看谁更接近。通过上面的结果可以看出：虚表的地址 与 常量区的地址最为接近。C:代码段（常量区）D:数据段（静态区）]]></description><category></category></item><item><title><![CDATA[【问题】为什么析构函数的名称统一处理为destructor？]]></title><link>https://blog.youkuaiyun.com/ProcedureStone/article/details/133218936</link><guid>https://blog.youkuaiyun.com/ProcedureStone/article/details/133218936</guid><author>ProcedureStone</author><pubDate>Sat, 23 Sep 2023 22:13:33 +0800</pubDate><description><![CDATA[对于析构函数，我们需要的就是函数名相同，因此将析构函数的名称统一处理为destructor.此时我们已经满足多态构造的2个条件的其中之一：基类的指针或引用， 剩下的我们需要满足。析构函数的名称统一处理为destructor的目的是为了解决。而根据指针(引用)指向的对象类型来选择对应的函数，这不就是。而这又引出了一个问题：为什么要进行析构函数的重写？]]></description><category></category></item></channel></rss>