自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(57)
  • 收藏
  • 关注

原创 ostringstream 多线程下性能问题探究

在实习过程中,有一个业务场景需要用到 ostringstream,但经过导师提醒,ostringstream 在多线程关系下,竞态消耗较大,但对于当前业务场景,每次操作,都有自己独立的 ostringstream,为什么还会有竞争关系存在呢?由此可以看出,stringstream 的调用时间,被 local 的构造析构函数拉长了,且对于数据的组装ostringtream 性能也是逊色于 fmt::memory_buffer,下面来分析原因。由此观之,标准库中所有输入输出流,都存在着此问题。

2023-09-08 14:24:06 318

原创 C++11轻松打印本地时间

将这个时间值进行转换,这样就能获取到一个本地时钟的相对时间值。这个函数会给我们返回一个转换后的指针(对于这个指针背后的内存不用我们多操心,因为其是一个静态对象,并不是从堆上分配的内存),这样我们就能完成最终的打印。想要对时间进行统计就需要调用C库,并且我们要考虑这样的调用是否能很好的封装到我们的类中。本节,我们将会使用本地时间,并对本地时间进行打印,还会给时间加上不同的偏移,这些操作很容易使用。这个STL时钟类是唯一一个能将时间点的值转换成一个时间结构体的类型,其能将时间点以能够看懂的方式进行输出。

2023-03-04 11:00:21 1421 1

原创 擦除/移除std::vector元素

由于 std::vector 能自动增长,并且使用方式简单,很受C++开发新手的喜爱。可以通过查阅手册,来了解这个容器该如何使用,比如删除元素。这样使用STL容器,只是了解容器的皮毛,容器应该帮助我们写出更简洁、维护性好和更快的代码。本节的全部内容都是在一个 vector 实例中删除元素。当 vector 中部的一个元素消失了,那么位于消失元素右边的所有元素都要往左移(这种操作的时间复杂度为O(n)。新手们会用循环来做这件事,因为循环的确好用。不过,循环会降低代码的优化空间。最后,比起STL的方

2023-02-27 11:46:32 463

原创 现代C++并行与并发笔记 附C++17线程池实现项目实战

C++11 之前,C++原生不支持并发和并发。但这并不意味着无法对线程进行操作, 只不过需要使用系统库的API进行操作(因为线程与操作系统是不可分开的)。随着C++11标准的完成,我们有了,其能给予我们可以在所有操作系统 上可移植的线程操作。为了同步线程,C++11也添加了互斥量,并且对一些RAII类 型的锁进行了封装。另外,也能够灵活的在线程间,进行 唤醒操作。另一些有趣的东西就是std::async和——我们可以将普通的函数封装 到std::async中,可以在后台异步的运行这些函数。

2023-01-12 13:00:42 1321 2

原创 SGI STL 二级空间配置源码刨析

当我们new一个对象时,实际做了两件事情:在SGI中,这两步独立出了两个函数:allocate申请内存,construct调用构造函数。这两个函数分别在和中。SGI STL的二级空间配置器,把128 字节的内存,通过一级空间配置器malloc和free进行管理。第一级就不用讲了。在STL的第二级配置器中多了一些机制,避免太多小区块造成的内存碎片,小额区块带来的不仅是内存碎片,配置时还有额外的负

2022-12-04 20:56:58 454

原创 2022 CMU15-445 Project 1 Buffer Pool

该 task 的知识点名为 可扩展动态散列这个部分要实现一个extendible哈希表,内部不可以用built-in的哈希表,比如。这个哈希表在中主要用来存储 buffer pool 中 page id 和 frame id 的映射关系。这里的算法我在课上没听懂太多,感觉给的图不是特别清晰,项目中给的IndexOf函数,是根据低位来进行判断。

2022-12-02 19:56:38 2402 7

原创 2022 CMU15-445 Project0 Trie

我们的代码必须遵循 Google C++ Style Guide。在线检测网站使用 Clang 自动检查源代码的质量。如果我们的提交未通过任何这些检查,您的项目成绩将为零。对于 Google C++ Style Guide ,我们可以看这里对于如何测试,我们可以在 build 目录下,执行以下代码以下命令会提示你哪里需要修正,但这不重要,我们先得实现功能,然后再去改这些,这里推荐 vscode 一键格式化代码,把风格设置为 Google,可以避免很多麻烦。

2022-12-01 18:13:35 3784 10

原创 MIT6.824_2021_学习总结 分布式常见知识点

学完 MIT6.824 2021,感觉自己对分布式系统有了一个初步的认知,打开了新世界的大门,作为分布式系统的入门课,无疑是王牌课程;但是确实是感觉学到了很多知识,但又没有一个总体的框架,感觉知识点都很零散;在此,给出自己的知识总结的脉络;学完了 MIT6.824,我学到了:

2022-10-26 18:48:49 1543

原创 力扣 atoi C++判断int类型变量溢出

忽略符号部分,只看数字部分,只要数字部分大于2147483647,就意味着数字部分的值等于或大于2147483648(即溢出) ,因此根据符号位便可判断负溢出或者是正溢出。在做这道题目时,被如何判断溢出难住了,因为我没做过这样的🤣,故看题解。res是之前叠加的部分,curChar是将要添加的那一位。

2022-09-25 23:49:52 521

原创 Linux man手册使用方法小计

在Linux中,我们大多数做不到对那么多的命令和系统调用做到如数家珍,于是我们便可通过模糊记忆中的命令名来通过man手册查看具体的使用方法,如返回值,参数,具体作用什么的。

2022-08-12 13:16:10 1006

原创 go gorm mysql报错:Error 1292: Incorrect datetime value: ‘XXX‘ for column ‘created_at‘ at row 1

在用go语言写项目操作数据库时,由于我的User结构体中存在时间字段然后在更新数据库时报了错从报错上来看大概是值的类型与值不对应造成的不合法于是我将值类型改为datatime和timestamp都不行,于是去查资料这个链接解决了我的问题,但该链接的主人解决的是时间不能为0,我一开始也有碰到,后面不懂解决遂放弃那个本来在我项目里的del_at字段。造成问题的主要原因是mysql的严格模式造成的。.........

2022-07-20 16:12:41 2419

原创 More Effective C++ 阅读笔记 解释清晰

More Effective C++ 阅读笔记 解释清晰

2022-07-13 19:53:22 662

原创 含泪整理 计算机网络详细八股文(第二部分 不断补充中)

计算机网络面试八股文整理

2022-07-12 00:01:17 1223

原创 含泪整理 计算机网络详细八股文(第一部分)

计算机网络八股文整理,超详细

2022-07-11 23:57:47 4646

原创 DNS协议解析过程通俗讲解

官方解释:DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。通俗的讲,我们更习惯于记住一个网站的名字,比如www.baidu.com,而不是记住它的ip地址,比如:167.23.10.2。由此可见,DNS 在日常生活中多么重要。每个人上网,都需要访问它,但是同时,这对它来讲也是非常大的挑战。一旦它出

2022-07-10 11:58:14 994

原创 TCP/IP 网络编程笔记 第四章 基于 TCP 的服务端/客户端(1)

根据数据传输方式的不同,基于网络协议的套接字一般分为 TCP 套接字和 UDP 套接字。因为 TCP 套接字是面向连接的,因此又被称为基于流(stream)的套接字。TCP 是 Transmission Control Protocol (传输控制协议)的简写,意为「对数据传输过程的控制」。因此,学习控制方法及范围有助于正确理解 TCP 套接字。TCP/IP 协议栈共分为 4 层,可以理解为数据收发分成了 4 个层次化过程,通过层次化的方式来解决问题链路层是物理链接领域标准化的结果,也是最基本的领域,专门定

2022-07-09 17:24:13 321

原创 Effective C++阅读笔记 具备复杂条款样例

教你如何写出现代高效的C++代码,Effective C++阅读笔记

2022-07-09 16:58:45 257

原创 TCP/IP 网络编程笔记 第三章 地址族与数据序列

IP 是 Internet Protocol(网络协议)的简写,是为手法网络数据而分配给计算机的值。端口号并非赋予计算机的值,而是为了区分程序中创建的套接字而分配给套接字的端口号。为使计算机连接到网络并收发数据,必须为其分配 IP 地址。IP 地址分为两类。两者之间的主要差别是 IP 地址所用的字节数,目前通用的是 IPV4 , IPV6 的普及还需要时间。IPV4 标准的 4 字节 IP 地址分为网络地址和主机(指计算机)地址,且分为 A、B、C、D、E 等类型。数据传输过程:某主机向 203.211.1

2022-07-08 00:23:54 610

原创 TCP/IP 网络编程笔记 第二章 套接字类型与协议设置

2.1.2 协议族(Protocol Family)通过 socket 函数的第一个参数传递套接字中使用的协议分类信息。此协议分类信息称为协议族,可分成如下几类:本书着重讲 PF_INET 对应的 IPV4 互联网协议族。其他协议并不常用,或并未普及。另外,套接字中采用的最终的协议信息是通过 socket 函数的第三个参数传递的。在指定的协议族范围内通过第一个参数决定第三个参数。套接字类型指的是套接字的数据传输方式,是通过 socket 函数的第二个参数进行传递,只有这样才能决定创建的套接字的数据传输方式

2022-07-06 17:59:48 211

原创 TCP/IP 网络编程笔记 第一章 理解网络编程和套接字

以电话机打电话的方式来理解套接字。调用 socket 函数(安装电话机)时进行的对话:有了电话机才能安装电话,于是就要准备一个电话机,下面函数相当于电话机的套接字。调用 bind 函数(分配电话号码)时进行的对话:套接字同样如此。就想给电话机分配电话号码一样,利用以下函数给创建好的套接字分配地址信息(IP地址和端口号):调用 bind 函数给套接字分配地址之后,就基本完成了所有的准备工作。接下来是需要连接电话线并等待来电。调用 listen 函数(连接电话线)时进行的对话:一连接电话线,电话机就可以转换

2022-07-01 12:02:40 221

原创 一文搞懂C++临时对象优化 附详细样例

C语言和C++在程序执行中,都是通过调用一系列的函数来实现的。并且,很多时候,编译器会帮助我们做一系列的事情,比如(在编译类的成员方法的时候,编译器默认添加 this 指针,以此来确定是哪一个对象调用了该成员方法)。得益于编译器或者说系统帮助我们做的一系列事情,我们可以更加方便地使用C++。但是凡事有利必有弊,因为系统有时候会自己调用一系列的函数,从另一个角度来说,也一定程度上降低了效率。而我们想要提高C++的执行效率,就需要了解程序(主要是对象)使用过程中都调用了哪些方法。VS2019 x86环境下,编

2022-06-30 00:56:16 398 1

原创 C++ mysql连接池 附带讲解与详细注释源码

MySQL数据库编程、单例模式、queue队列容器、C++11多线程编程、线程互斥、线程同步通信和unique_lock、基于CAS的原子整形、智能指针shared_ptr、lambda表达式、生产者-消费者线程模型

2022-06-29 15:29:34 692 5

原创 一文看懂Ngnix内存池源码 附带详细讲解,清晰结构图

可以先看一下大概过程:首先Ngnix内存池分为主内存池和其他内存池,主内存用来管理其他内存池,和自身初始具有的能够分配的内存。**但主内存池和其他内存池在结构定义上是一样的,**都是下面代码块中的 ,**且具有别名 ,**只不过其他内存池再被创建的时候,会被分割,将除去成员 以外的部分作为可分配内存。如下图所示,图中主内存池和其他内存池在大小上可能具有迷惑性,但实际上主内存池和其他内存池所占的大小是一样的,只不过可分配内存不一样。这里是各结构体中的关系:是一个分流函数,按一个标准分割大块内存分配

2022-06-28 15:54:40 841

原创 《深度探索C++对象模型》笔记目录

读书笔记,特此记录。😇😇😇《深度探索C++对象模型》阅读笔记 第一章 关于对象《深度探索C++对象模型》阅读笔记 第二章 构造函数语意学《深度探索C++对象模型》阅读笔记 第三章 Data语意学《深度探索C++对象模型》阅读笔记 第四章 Function语意学《深度探索C++对象模型》阅读笔记 第五章 构造、解构、拷贝语意学《深度探索C++对象模型》阅读笔记 第六章 执行期语意学《深度探索C++对象模型》阅读笔记 第七章 站在对象模型的尖端...

2022-06-25 17:16:25 223

原创 《深度探索C++对象模型》阅读笔记 第七章 站在对象模型的尖端

然而,member functions(至少对于那些未被使用过的)不应该被“实例化”。只有在member functions被使用的时候,C++ Standard才要求它们被“实例化”。目前的编译器并不精确遵循这项要求。之所以由使用者来主导“实例化”(instantiation)规则,有两个主要原因:可以明确的要求在一个文件中将整个类模板实例化:也可以显示指定实例化一个模板类的成员函数:或是针对一个模板函数:模板的错误报告,使用模板并遇到错误的大概都深有体会,那就是一个灾难。所以在一个parsing策

2022-06-25 17:10:53 536

原创 《深度探索C++对象模型》阅读笔记 第六章 执行期语意学

如果一个区段(译注:以 { } 括起来的区域)或函数中有一个以上的离开点,情况会稍微混乱一些。Destructor必须被放在每一个离开点(当时object还存活)一般而言我们会把object尽可能放置在使用它的那个程序区段附近,这样做可以节省不必要的对象产生操作和摧毁操作,由于这样的限制,下面这些munch策略就浮现出来了:因为静态语意保证了 mat_identity 在整个程序周期都存在,而不会在函数 identity()退出时被析构,所以:以下就是书中作者在cfront之中的做法。首先,我导人一个临

2022-06-25 17:07:36 231

原创 《深度探索C++对象模型》阅读笔记 第五章 构造、解构、拷贝语意学

const 成员变量的用法和普通 const 变量的用法相似const 成员函数可以使用类中的所有成员变量,但是不能修改它们的值一旦将对象定义为常对象之后,不管是哪种形式,该对象就只能访问被 const 修饰的成员了(包括 const 成员变量和 const 成员函数),因为非 const 成员可能会修改对象的数据(编译器也会这样假设),C++禁止这样做。1. 即使是一个抽象基类,如果它有非静态数据成员,也应该给它提供一个带参数的构造函数,来初始化它的数据成员。或许你可以通过其派生类来初始化它的数据成员(假

2022-06-25 17:04:41 212

原创 《深度探索C++对象模型》阅读笔记 第四章 Function语意学

Nonstatic Member Functions(非静态成员函数)C++的设计准则之一就是:nonstatic member function至少必须和一般的nonmember function有相同的效率。名称的特殊处理(Name Mangling)一般而言,member的名称前面会被加上class名称,形成独一无二的命名。Virtual Member Functions(虚拟成员函数)vptr表示由编译器产生的指针,指向virtual table。它被安插在每一个“声明有(或继承自)一个或

2022-06-25 17:01:38 250

原创 《深度探索C++对象模型》阅读笔记 第三章 Data语意学

Lippman的一个法国读者的结果是:而我在VS2019,win10,64bit上以及Linux环境下的Ubuntu下输出都是https://www.cnblogs.com/fengyaoyao/p/10262312.htmlhttps://blog.csdn.net/yi_chengyu/article/details/120856687先贴几个重要结论:C++的空类是指这个类不带任何数据,即类中没有非静态(non-static)数据成员变量,没有虚函数(virtual function),也没有虚基

2022-06-25 16:58:00 129

原创 《深度探索C++对象模型》阅读笔记 第二章 构造函数语意学

在读《深度探索C对象模型》之前,我一直停留在上述二种误解上,所幸的是Lippman为我破除了藩篱。下面的部分我将随《深度探索C对象模型》对C++默认构造函数一探究竟。C++标准规定:如果类的设计者并未为类定义任何构造函数,那么会有一个默认构造函数被暗中生成,而这个暗中生成的默认构造函数通常是不做什么事的(无用的),下面四种情况除外。换句话说,有以下四种情况编译器必须为未声明构造函数的类生成一个会做点事的默认构造函数。我们会看到这些默认构造函数仅“忠于编译器”,而可能不会按照程序员的意愿程效命。若

2022-06-25 16:53:18 232

原创 《深度探索C++对象模型》阅读笔记 第一章 关于对象

C++类包含两种数据成员:静态数据成员和非静态数据成员;同时包含成员函数,静态函数和虚函数三种成员函数在此模型中,被配置于每一个 之内,则被存放在所有的 之外. 和 也被放在所有的 之外. 则由虚表机制实现,class 里保存着一个指向虚表的指针,虚表中存放着指向虚函数的函数指针。每一个class所关联的type_info object(用以支持 runtime type identification,RTTI)也经由 virtual table 被指出来,通常是放在表格的第一个slot处。这个模

2022-06-25 16:51:02 411

原创 易上手的Makefile文件简介与基本语法

简单的概括一下Makefile 中的内容,它主要包含有五个部分,分别是:显式规则说明了,如何生成一个或多的的目标文件。这是由 Makefile 的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。由于我们的 make 命名有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写 Makefile,这是由 make 命令所支持的。在 Makefile 中我们要定义一系列的变量,变量一般都是字符串,这个有点像C语言中的宏,当 Makefile 被执行时,其中的变量都会被扩展到相应的引用位置上。其包

2022-06-21 16:54:50 220

原创 一文讲清 RPC是什么?和HTTP什么关系?

RPC:Remote Procedure Call,远程过程调用是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。为什么要用RPC呢?就是无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如不同的系统间的通讯,甚至不同的组织间的通讯,由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用。也便于微服务的划分,根据业务模块做了不同的拆分,像用户的服

2022-06-10 01:16:28 289

原创 C++ thread_local 关键字

C++11中有如下几种存储类型:如下代码所示输出:

2022-06-09 14:24:07 232

原创 一文让你搞懂 C语言可变参数 VA_LIST原理详解

在学习C++高性能框架Sylar时遇到的新知识,特以此记录,另外对于C/C++宏的基本使用不太清晰的小伙伴可以看我的这篇博客 C/C++宏的基本使用方法附例子讲解 是在C语言中解决变参问题的一组宏,变参问题是指参数的个数不定,可以是传入一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应,用起来是很灵活。首先在函数里定义一具 型的变量 ,这个变量是指向参数的指针 ,通过指针运算来调整访问的对象;然后用 宏初始化变量刚定义的 变量 ,实际上

2022-06-08 13:39:57 4526

原创 C/C++宏的基本使用方法附例子讲解

宏是C/C++所支持的一种语言特性,我对它最初的印象就是它可以替换代码中的符号,最常见的例子便是定义一个圆周率,之后在代码中使用 来代替具体圆周率的值。确实如此,宏提供了一种机制,能够使你在编译期替换代码中的符号或者语句。当你的代码中存在大量相似的、重复的代码时,使用宏可以极大的减少代码量,便于书写。...

2022-06-07 21:40:16 7678 1

原创 C/C++ linux C/C++静态库与动态库详解(附类go语言gin框架——wfrest库的推荐与链接使用)

文章目录什么是库GCC编译器基本参数ar命令为什么需要库(library)静态库静态库的创建静态库使用动态库/共享库动态库的创建动态库使用原因及解决库的工作原理解决wfrestwfrest 库的获取采用动态库采用静态库什么是库库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。回顾一

2022-05-26 12:26:11 958

原创 C++ STL模板库用法查询及一些常见面试题(自用)

C++STL模板库文章目录C++STL模板库用法查询Array1.使用2.创建3.成员函数Vector1.使用2. 创建3.成员函数deque1.使用2. 创建3.成员函数list1.使用2. 创建3.成员函数map1.使用2.创建3.成员函数multimap1.使用2.创建3.成员函数set1.使用2.创建3.成员函数multiset1.使用2.创建3.成员函数无序关联式容器stack1.使用2.创建3.成员函数queue1.使用2.创建3.成员函数priority_queue1.使用2.创建3.成员函

2022-04-29 14:53:42 1449

原创 堆——神奇的优先队列 大根堆小根堆详解,附小根堆C++代码实现与STL相关

文章目录前置知识堆操作小根堆插入代码实现小根堆删除代码实现测试代码STL实现——priority_queue1.使用2.创建3.成员函数前置知识堆是一个完全二叉树(最后一层可以不满,上面的每一层都是满的。一个结点若只有一个孩子结点,那一定是它的左孩子。如下图)这是一个逻辑上基于完全二叉树、物理上一般基于线性数据结构(如数组、向量、链表等)的一种数据结构。完全二叉树最重要的性质:如果n个节点的完全二叉树的节点按照层次并按从左到右的顺序从0开始编号,对于人一个绩点都有:序号为0的节点是根对

2022-04-03 17:33:14 5987 2

原创 C++11新标准面试题精选

C++11新标准面试题精选文章目录C++11新标准面试题精选1、C++ 11有哪些新特性?2、auto、decltype和decltype(auto)的用法3、C++中NULL和nullptr区别4、智能指针的原理、常用的智能指针及实现**环形引用**5、说一说你了解的关于lambda函数的全部知识7、说说你了解的auto_ptr作用9、手写实现智能指针类需要实现哪些函数?1、C++ 11有哪些新特性?nullptr替代 NULL引入了 auto 和 decltype 这两个关键字实现了类型推导

2022-03-28 10:20:36 7658 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除