- 博客(523)
- 收藏
- 关注
原创 cmake常用指令
基本语法格式:指令(参数1 参数2 …)参数之间使用空格或分号分开;指令是大小写无关的,但是参数是大小写相关的cmake_minimum_required用来指定cmake的最小版本要求cmake_minimum_required(VERSION 2.18.0)project定义工程名set定义变量,set(变量名 value1 value2 …)include_directories(dir1 dir2 …)添加多个头文件搜索路径,绝对路径也可以,
2024-08-13 20:13:57
119
原创 cmake常用的内置变量
CMake 提供了一系列内置变量,这些变量可以帮助你在构建过程的各个阶段获取系统信息、控制构建行为以及配置项目。这些变量通常在 CMakeLists.txt 文件中使用,以决定不同的配置和编译选项。
2024-08-12 20:14:39
316
原创 JsonCPP源码分析——分配器和配置器
该文件定义了一个分配器模版,该文件主要使用了内存对齐控制、rebind机制(C++ 标准库的分配器接口要求提供 rebind 机制,以支持不同类型的分配)、::operator new、std::addressof等技术。1、allocator.h文件。2、config.h文件。
2024-07-15 18:37:41
831
原创 深入理解Cookies:网络会话的幕后英雄
在我们日常浏览网页的过程中,Cookies扮演了至关重要的角色。它们帮助我们保持登录状态、记住偏好设置和跟踪网站活动。本文将详细介绍Cookies的概念、工作原理、应用场景以及如何管理Cookies。Cookies是一种存储在用户计算机上的小型文本文件,由服务器生成,并在用户访问网站时发送到用户的浏览器。Cookies包含了一些数据,这些数据可以在用户与网站交互时被服务器读取和使用。2、Cookies的组成部分。4、Cookies应用场景。1、什么是Cookies。
2024-07-04 11:03:04
287
原创 一篇文章了解URI
在现代网络应用中,URI(Uniform Resource Identifier,统一资源标识符)是一个重要的概念。URI用于标识互联网上的资源,无论是一个网页、一张图片、还是一个视频文件,URI都可以唯一地指向这些资源。本文将深入介绍URI的各个组成部分及其在实际应用中的作用。URI是统一资源标识符的缩写,它是一种用于标识资源的字符串。URI的标准定义由IETF在RFC 3986中提供。
2024-07-04 11:02:49
260
原创 Sylar服务器框架——TcpServer模块
TcpServer类的HandleClient是交由继承类来实现的。使用TcpServer时,必须从TcpServer派生一个新类,并重新实现子类的handleClient操作,这点可以参考test_tcp_server.cc。TcpServer类支持同时绑定多个地址进行监听,只需要在绑定时传入地址数组即可。TcpServer还可以分别指定接收客户端和处理客户端的协程调度器。
2024-07-04 11:01:42
153
原创 Sylar服务器框架——Address模块
但这并不影响套接字接口的通用性,因为在使用时,所有类型的地址都会转换成sockaddr指针形式,又由于以上所有的地址结构的前两个字节都表示地址族,所以通过sockaddr指针总能拿到传入地址的地址类型,通过地址类型判断出地址长度后,再通过sockaddr指针取适合该地址的长度即可拿到地址内容。对此,Berkeley套接字接口拟定了一个通用套接字地址结构sockaddr,用于表示任意类型的地址,所有的套接字API在传入地址参数时都只需要传入sockaddr类型,以保证接口的通用性。
2024-07-03 13:31:44
610
原创 Sylar服务器框架——线程模块
1、该模块比较简单,提供了线程类和线程同步类,需要注意的是,线程类的构造函数传入线程入口函数和线程名称,线程入口函数类型为void(),如果带参数,则需要用std::bind进行绑定。
2024-07-03 13:28:44
212
原创 理解条件变量:并发编程的利器
条件变量是一种同步原语,通常与互斥锁(Mutex)一起使用。它主要用于让一个或多个线程等待某个条件发生变化,然后被通知继续执行。条件变量提供了一种有效的方式来避免忙等待(busy waiting),从而提高程序的效率。2、条件变量的工作原理。
2024-07-03 13:23:39
316
原创 shared_from_this
为了使用 shared_from_this,类需要继承 std::enable_shared_from_this,并在需要生成 std::shared_ptr 的地方调用 shared_from_this。通过继承 std::enable_shared_from_this,类可以利用内部的 std::weak_ptr 来实现这一功能。std::enable_shared_from_this 类模板的内部实现非常巧妙,主要利用了 std::weak_ptr。4、shared_from_this 的实现细节。
2024-07-03 13:22:31
340
原创 std::dynamic_pointer_cast
1、std::dynamic_pointer_cast 是 C++ 标准库中提供的一种智能指针转换方法,用于在继承层次结构中进行类型安全的向下转换(downcasting),类似于普通指针的 dynamic_cast。它接受一个 std::shared_ptr 并尝试将其转换为另一个类型的 std::shared_ptr。如果转换失败,std::dynamic_pointer_cast 返回一个空的 std::shared_ptr。std::dynamic_pointer_cast 在运行时检查类型。
2024-07-03 13:22:11
262
原创 一篇文章了解lambda表达式的本质
其实这里就可以看出,值捕获时,编译器会把捕获到的值作为类的成员变量,并且变量是以值的方式传递的。需要注意的时,如果所有的参数都是值捕获的方式,那么生成的operator()函数是const函数的,是无法修改捕获的值的,哪怕这个修改不会改变lambda表达式外部的变量,如果想要在函数内修改捕获的值,需要加上关键字 mutable。一个lambda表达式基本上就是一个函数,但它没有名字。(备注:这里的编译的翻译结果并不和真正的结果完全一致,只是把最主要的部分体现出来,其他的像类到函数指针的转换函数均省略)
2024-04-18 23:58:16
889
原创 调用pthread_create时系统做了哪些事情
需要注意的是,在多核处理器上,新创建的线程可能立即在另一个核心上开始执行,而调用pthread_create的线程继续在原来的核心上执行。退出线程时(通过返回从启动例程或调用pthread_exit)会释放线程的执行上下文和部分资源,但线程的标识符和某些资源会保持不变,直到调用pthread_join或采取类似措施以回收这些资源。初始化寄存器和线程上下文:设置新线程的程序计数器(PC)、堆栈指针(SP)等寄存器,并初始化新线程的执行上下文以准备运行。线程标识符分配:系统为新线程分配一个唯一的线程ID。
2024-04-17 22:46:54
261
原创 C++ 就地构造对象
这是因为在C++的内存模型中,当对象被创建(无论是通过新运算符还是其他方式)时,它会占据一片内存,并且在这片内存上运行其构造函数。但是,在使用就地构造时,我们只是在已经分配的内存上直接构造了对象,没有额外的机制来跟踪这片内存或者对象的生命周期,因此,我们需要手动管理这块内存和对象的生命周期。使用placement new要非常小心,确保分配的内存块足够大,并且正确管理对象的生命周期,包括手动调用析构函数和释放内存。此外,在指定内存位置上创建对象时,请确保该位置是合法的、对齐的,并且未被使用。
2023-10-07 16:09:05
362
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人