沉默.@
码龄4年
关注
提问 私信
  • 博客:60,431
    60,431
    总访问量
  • 55
    原创
  • 1,580,906
    排名
  • 1,715
    粉丝
  • 1
    铁粉
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:湖北省
  • 加入CSDN时间: 2020-10-23
博客简介:

smf12138的博客

查看详细资料
个人成就
  • 获得335次点赞
  • 内容获得114次评论
  • 获得699次收藏
  • 代码片获得339次分享
创作历程
  • 50篇
    2022年
  • 5篇
    2021年
成就勋章
创作活动更多

HarmonyOS开发者社区有奖征文来啦!

用文字记录下您与HarmonyOS的故事。参与活动,还有机会赢奖,快来加入我们吧!

0人参与 去创作
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

C++四种强制类型转换

操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型.进行强制类型转换. 而变量x和变量p,一个为数值类型,一个为指针类型,不相近,不能用。标准C++为了加强类型转换的可视性,引入了4种命名的强制类型转换操作符.用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可以用。用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)这段代码中,d变量和a变量都表示数值类型,可以使用。因此C++ 提出了自己的类型转换风格,的简称,即:运行时类型识别。
原创
发布博客 2022.12.13 ·
1714 阅读 ·
2 点赞 ·
1 评论 ·
4 收藏

C++11【包装器】

头文件中,是一个函数模板,它就像一个函数包装器(适配器),接收一个可调用对象,生成一个新的可调用对象来适应原对象的参数列表.函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来 “适应” 原对象的参数列表.是一个逗号分隔的参数列表,对应给定的callable的参数,当我们调用。那么,包装器是如何解决了模板的效率低下,实例化了多份的问题呢?的名字,其中n是一个整数,这些参数是占位符,表示。本质是一个类模板,也是一个包装器.包装器也叫做适配器,C++中的。中的参数,它们占据了传递给。
原创
发布博客 2022.12.13 ·
566 阅读 ·
1 点赞 ·
0 评论 ·
2 收藏

多线程编程【POSIX信号量】

信号量是一个有整数值的对象,可以用两个函数来操作它在POSIX标准中,是sem_wait()和sem_post(). 因为信号量的初始值能够决定其行为,所以首先要初始化信号量,才能调用函数与之交互.sem_t s;我们定义了一个信号量,通过第三个参数,将它的值初始化为1.sem_init()的第二个参数,设置为0,表示信号量是在同一进程的多个线程共享的.可以参考man手册,了解信号量的其他用法(如何用于跨不同进程的同步访问).信号量初始化之后,我们可以调用sem_wait()和sem_post()
原创
发布博客 2022.12.12 ·
710 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

如何制作并使用动静态库

程序在编译链接时把库的代码链接到可执行文件中,程序运行的时候将不再需要静态库。:程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。但我们的头文件和库文件都不在当前目录下,也不在系统路径中.当我们给别人使用这个静态库时,不仅要给别人静态库文件,那么了解了动静态库的概念之后,如何制作动静态库呢?使用动态库,与静态库一样,我们将我们制作的动态库与。接着,我们使用刚才的指定搜索路径的方式来编译。使用如下命令我们便可以将自己写的。为了使用静态库,我们创建一个。文件也需要,所以我们将。
原创
发布博客 2022.12.09 ·
741 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

Linux基础IO

操作文件,除了语言级别的接口,我们还可以采用系统接口来进行文件访问.open()pathname要打开或者创建的目标文件flags打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行"或"运算,构成flags.O_RDONLY:只读打开O_WRONLY:只写打开O_RDWR:读、写打开,这三个常量,必须指定一个且只能指定一个O_CREAT:若文件不存在,则创建它,需要指明mode选项,来指明新文件的访问权限O_APPEND:追加写成功:新打开的文件描述符失败:-1函数open()
原创
发布博客 2022.12.08 ·
410 阅读 ·
1 点赞 ·
0 评论 ·
1 收藏

vector深度剖析及模拟实现

这是在VS版本下的扩容机制:每次扩容1.5倍但在Linux下,它每次以2倍的方式扩容:所以,它并不是每次必须以固定的方式扩容,而是选择一个合适的数值:因为单次增容越多,插入N个值,当需要增容时,增容次数越少,但单次增容越多,可能浪费的空间就越多.单次增少了,会导致频繁扩容,效率降低.我们在对进行扩容时,需要将原来空间上的数据拷贝到新开的空间上,那么拷贝数据使用会不会有问题呢?首先来看一个简单的:可以看到,对于上述简单的vector,使用并不会带来什么问题,但是让我们看看下面这个场景:所以,在扩容时,我们
原创
发布博客 2022.12.07 ·
422 阅读 ·
2 点赞 ·
0 评论 ·
0 收藏

文件系统实现

我们想要了解文件系统在磁盘上的数据结构的整体组织,首先需要将磁盘分成块(). 简单的文件系统只使用一种块大小,我们选择常用的.因此,我们对构建文件系统的磁盘分区看法很简单:一系列块,每块大小为,在大小为N个块的分区中,这些块的地址为,假设我们有一个非常小的磁盘,只有块:那么我们需要在这些块中存储什么呢?首先需要存储用户数据,任何文件系统大多数的空间都是用户数据,我们将用于存放用户数据的块称为数据区域,所以我们将上述磁盘中的个块用来存放用户数据:文件系统还必须记录每个文件的信息,该信息是元数据的关键部分,记录
原创
发布博客 2022.12.06 ·
1300 阅读 ·
2 点赞 ·
0 评论 ·
7 收藏

虚拟内存系统【页面置换算法】

我们需要做很多工作,在每次页访问(即每次内存访问,不管是取指令还是存储)时,我们都必须更新一些数据,从而将该页移到列表的前面(最近使用),与FIFO相比,FIFO的页列表仅在页被踢出或者新页添加到列表时才被访问,为了记录哪些页是最少和最近被使用,系统必须对每次内存引用做一些记录工作,有可能会影响性能.记录每个页面的访问次数,当发生缺页中断时,将访问次数最少的页面置换出去,此方法需要对每个页面访问次数进行统计,额外开销.)无法确定页的重要性:即使页0已被多次访问,仍然会将其踢出,因为它是第一个进入内存的.
原创
发布博客 2022.12.01 ·
1706 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

将任务放在后台处理的好处

将某些任务放在后台执行
原创
发布博客 2022.12.01 ·
772 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

虚拟内存系统【如何支持巨大的虚拟地址空间】

的所有页都被交换到了磁盘上,因此它目前没有运行,有一块交换空间是空闲的,通过这个小例子,你应该能够看出,使用交换空间是如何让系统假装比实际物理内存更大.如果存在位设置为1,则表示该页存在于物理内存中,如果存在位设置为0,则表示该页不在物理内存中,而在硬盘中. 访问不在物理内存中的页,这种行为被称为。现在我们在硬盘上有一部分交换空间,需要在系统中增加一些机制,来支持从硬盘交换页.但是,我们要支持页可以从内存交换到磁盘,必须添加更多的机制,都只有一部分有效页在内存中,剩下的在硬盘的交换空间中,进程。
原创
发布博客 2022.12.01 ·
664 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

LRU Cache【理论讲解 + 代码实现】

LRU是的缩写,意思是最近最少使用. 它是一种Cache替换算法.什么是Cache?狭义的Cache是指位于CPU和主存之间的快速RAM,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术. 广义上的Cache指的是位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构. 除了CPU与主存之间有Cache,内存与硬盘之间也有Cache,乃至在硬盘与网络之间也有某种意义上的Cache-称为Internet临时文件或网络内容缓存等.
原创
发布博客 2022.12.01 ·
1237 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏

虚拟内存系统【多级页表】

虚拟内存系统【多级页表】
原创
发布博客 2022.11.29 ·
4225 阅读 ·
7 点赞 ·
0 评论 ·
41 收藏

深入理解死锁问题

你可能在想,上文中提到的这个死锁的例子,很容易就可以避免,例如:只要线程1和线程2都用相同的抢锁顺序,死锁就不会发生,那么,死锁为什么还会发生?运行在同一个处理器上,这种保守的静态方案会明显增加完成任务的总时间,为了避免死锁,没有让它们并发运行,付出了性能的代价.之前,都认为锁是被占有的,多个抢锁操作通常会带来麻烦,因为我们等待一个锁时,持有另一个锁.. 因此,在设计大型系统的锁机制时,你必须要仔细的去避免循环依赖导致的死锁.另一个线程可以采用相同的加锁方式,但是不同的加锁顺序,程序不会产生死锁.
原创
发布博客 2022.11.28 ·
682 阅读 ·
1 点赞 ·
0 评论 ·
2 收藏

线程池实现

线程过多会带来调度开销,进而影响缓存局部性和整体性能. 而线程池维护着多个线程,等待着管理者分配可并发执行的任务. 这。,线程池不仅能保证内核的充分利用,还能防止过分调度,可用的线程数量应该取决于可用的并发处理器,处理器内核,内存,网络。
原创
发布博客 2022.11.27 ·
208 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

多线程编程【条件变量】

调用时,这个互斥量是已上锁状态. wait的职责是释放锁,并让调用线程休眠(原子地).当线程被唤醒时(即另外某个线程发信号给它后),它必须重新获取锁,再返回调用者,这是为了避免线程在陷入休眠时,产生一些。尽管不是所有情况都严格需要,但有效且简单的做法,还是在使用条件变量发送信号时持有锁,虽然上面的例子是必须加锁的情况,但也有一些情况可以不加锁,但为了简单,请在调用。让我们来看看生产者和消费者之间的信号逻辑,当生产者想要填充缓冲区时,它等待缓冲区变空,消费者具有完全相同的逻辑,但等待不同的条件-变满.
原创
发布博客 2022.11.26 ·
1271 阅读 ·
5 点赞 ·
0 评论 ·
8 收藏

常见磁盘调度算法总结

在现代系统中,磁盘可以接受多个分离的请求,它们本身具有复杂的内部调度程序(它们可以准确地实现SPTF.在磁盘控制器内部,所有相关细节都可以得到,包括精确的磁头位置). 因此,操作系统调度程序通常会选择它认为最好的几个请求(如 16),并将它们全部发送到磁盘。磁盘然后利用其磁头位置和详细的磁道布局信息等内部知识,以最佳可能(SPTF)顺序服务于这些请求.磁盘调度程序执行的另一个重要相关任务是I/O 合并(I/O merging).
原创
发布博客 2022.11.22 ·
1957 阅读 ·
0 点赞 ·
0 评论 ·
6 收藏

Trie字典树详解

Trie树,又叫字典树,前缀树(Prefix Tree),单词查找树,是一种多叉树的结构.上图就是一颗Trie树,表示了关键字集合根节点不包含字符,除根节点外每一个节点都只包含一个字符从根节点到某一节点,路径上的字符连接起来,为该节点对应的字符串每个节点的所有子节点包含的字符都不相同.算法核心:利用字符串的公共前缀来减少查询时间,最大限度的减少无畏字符串的比较.单词检索统计和排序字符串字符串前缀搜索我们来看一个场景:当我们在浏览器的搜索框中打出一个字符串的前缀时,它便实时的单词自动补齐.对于。
原创
发布博客 2022.11.22 ·
2012 阅读 ·
3 点赞 ·
0 评论 ·
20 收藏

一致性哈希算法【图解理论 + 代码实现】

简单来说,就是比如现在我们来了一个用户请求,假如它叫张三,并被负载均衡到2号服务器上,那么2号服务器就保存了他的登录状态信息,但是如果下一次张三发出请求,他又被映射到了一号服务器上,但一号服务器上没有保存有关张三的会话信息,那么1号服务器怎么知道张三的登录状态呢?例如,服务端需要增删查看数据,如果服务端直接去数据库中查找,效率太低,所以我们需要将一些热点数据先缓存起来,以便下次查找时提高效率,假设现在我们以用户id作为。所以,综合上述的两个场景可以看出,普通的哈希算法是存在许多问题的,所以我们需要引入。
原创
发布博客 2022.11.21 ·
1236 阅读 ·
3 点赞 ·
0 评论 ·
7 收藏

static和const关键字的区别

static和const的区别
原创
发布博客 2022.11.17 ·
793 阅读 ·
0 点赞 ·
0 评论 ·
5 收藏

结构体内存对齐详解

数据结构(尤其是栈)应该尽可能在自然边界上对齐,原因在于:为了访问未对齐的内存,处理器需要做两次访问,而对齐的内存仅需要一次访问.不是所有的硬件平台都能访问到任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。结构体的总大小为12字节。在设计结构体的时候,我们。
原创
发布博客 2022.11.17 ·
235 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏
加载更多