自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 求助-内存对齐相关问题

我个人未使用过6个字节对齐方式,所以回答到是6个字节,毕竟寻址都是2的整数倍。但是具体为什么丢失,或者是其它对齐方式丢失,我不知道如何作答。最近接到深圳xcsj的第二次面试邀请,其中对于内存对齐这里有一些问题不明白,网上也没有找到相关资料,所以求助各位专家帮忙解答。Q2:4,6,8字节对齐,那些对齐方式网络传输(tcp)会产生数据丢失,为什么?Q1:4字节与8个字节哪个对齐方式更有优势?我个人认为具体情况具体分析吧。求助-内存对齐相关问题。

2024-01-03 21:24:45 440

原创 c++中使用互斥量

当 std::lock 成功的获取一个互斥量上的锁,并且当其尝试从另一个互斥量上再获取锁时,就会有异常抛出,第一个锁也会随着异常的产生而自动释放,所以 std::lock 要么将两个锁都锁住,要不一个都不锁。不过,事情没那么简单,比如,当有多个互斥量保护同一个类的独立实例时,一个操作对同一个类的两个不同实例进行数据的交换操作,为了保证数据交换操作的正确性,就要避免数据被并发修改,并确保每个实例上的互斥量都能锁住自己要保护的区域。的好处在于,可以将所有 std::lock 替换掉,从而减少潜在错误的发生。

2023-12-18 14:21:51 848

翻译 c++中什么是RAII(官方文档释义)

资源获取即初始化),或称 RAII,是一种 C++ 编程技术[,它将必须在使用前请求的资源(分配的堆内存、执行线程、打开的套接字、打开的文件、锁定的互斥体、磁盘空间、数据库连接等——任何存在受限供给中的事物)的生命周期绑定与一个对象的相绑定。RAII 保证资源可用于任何会访问该对象的函数(资源可用性是一种,这会消除冗余的运行时测试)。它亦保证所有资源在其控制对象的生存期结束时,以获取顺序的逆序释放。

2023-12-14 17:05:02 140

原创 c++标识线程

直接通过std::thread对象的成员函数get_id()来获取。如果thread对象没有与任何执行线程相关联,get_id()将返回std::thread::id对象,它按照默认的构造方式生成,表示线程不存在(实际测试时,直接core dumped)。还可以通过在当前线程中调用std::this_thread::get_id()获取。线程id是唯一的,如果两个值不同就代表两个不同线程,或者某线程不存在(实际测试,不存在时,编译会报错)线程ID类型为std::thread::id,它有。

2023-12-14 16:45:55 445

原创 运行时线程的数量stdthreadhardware_concurrency()

这个函数会返回真正并发在一个程序中的线程数量。例如, 多核系统中, 返回值可以是CPU核芯的数量。返回值也仅仅是一个提示, 当系统信息无法获取时, 函数也会返回0。

2023-12-14 16:24:16 342

原创 c++转移线程所有权

假设要写一个在后台启动线程的函数, 并想通过新线程返回的所有权去调用这个函数, 而不是等待线程结束再去调用;或者创建一个线程, 并在函数中转移所有权, 都必须要等待线程结束。c++标准库中含有不少资源占有类型,如std::ifstream、std::unique_ptr类、std::thread等都是可以移动但是不可复制的。因此对于一个具体的执行线程,其归属权可以在几个std::thread实例间转移。thread支持移动操作的意义是,函数可以便捷的向外部转移线程的归属权。

2023-12-14 15:55:48 387

原创 c++向线程函数传递参数及编译错误排查

虽然上述代码可以正常编译运行,但是还有需要我们关注的,func函数第二个参数是一个string类型,但是,字符串是以const char* 的方式传递的,进入新线程的上下文环境后,才转换成string的。原因是,thread的构造函数并不知情func函数的参数,所以是直接复制我们提供的参数s,然而线程库内部代码会把参数的副本当成。类别(只能移动,不可复制),并以右值的形式传递。这样就会有歧义,第17行,编译器会认为这是一个声明。为了避免这样不必要的麻烦,我们采用同一初始化方式。编译的时候会发现报错了,

2023-12-14 12:11:11 467

原创 c++中explicit关键字用法

(1) 指定构造函数或转换函数 (C++11 起)或推导指引 (C++17 起)为显式,即它不能用于隐式转换和复制初始化。(2) explicit 说明符可以与常量表达式一同使用。当且仅当该常量表达式求值为 true 时函数为显式。explicit 说明符只可出现于在类定义之内的构造函数或转换函数 (C++11 起)的。可以看到,调用show函数的时候,自动将参数整型1转换成了A类型。当表达式中为ture表示禁止使用隐式转换,false表示允许使用。c++20中还可以使用表达式来控制是否使用隐式转换。

2023-11-28 15:57:01 430

原创 算法--单链表

解法:这个比较容易,直接对比两个两个链表节点,小的节点直接插入到返回的新链表上。

2023-10-26 21:36:46 478

原创 计算机系统的基本概念

本文主要以hello.c这个程序的整个生命周期来简单了解一下计算机系统结构的基本概念。此刻,hello.c源程序已经被编译系统翻译成了可执行目标文件hello,并被存放在磁盘上。要想在 Unix系统上运行该可执行文件,我们将它的文件名输入到称为shell的应用程序中进行执行shell是一个命令行解释器,它输出一个提示符,等待输入一个命令行,然后执行这个命令。如果该命令行的第一个单词不是一个内置的shell命令,那么shell就会假设这是一个可执行文件的名字,它将加载并运行这个文件。

2023-09-10 23:39:21 499

原创 程序执行的四个阶段

链接阶段:请注意,hello程序调用了printf函数,它是每个C编译器都提供的标准C库中的一个函数。printf函数存在于一个名为printf.o的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到我们的he11o.o程序中。汇编阶段:接下来,汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序(relocatable object program)的格式,并将结果保存在目标文件hello.o中。结果就得到了另一个C程序,通常是以。

2023-09-10 17:14:03 374

原创 libevent源码学习7---libevent常用设置

libevent 有一些被整个进程共享的、影响整个库的全局设置。必须在调用libevent 库的任何其他部分之前修改这些设置,否则,libevent 会进入不一致的状态。

2023-08-26 15:36:02 274

原创 libevent源码学习6---链接监听器evconnlistener

evconnlistener 机制提供了监听和接受 TCP 连接的方法。

2023-08-25 19:04:11 369

原创 libevent源码学习5---数据封装evBuffer

libevent 的 evbuffer 实现了为向后面添加数据和从前面移除数据而优化的字节队列。evbuffer 用于处理缓冲网络 IO 的“缓冲”部分。它不提供调度 IO 或者当 IO 就绪时触发 IO 的 功能,这是 bufferevent 的工作。

2023-08-25 17:51:46 214

原创 libevent源码学习4--数据缓冲Bufferevent

很多时候,除了响应事件之外,应用还希望做一定的数据缓冲。libevent为此提供了一种通用机制,即bufferevent。bufferevent 由一个底层的传输端口,一个读取缓冲区和一个写入缓冲区组成。与通常的事件在底层传输端口已经就绪,可以读取或者写入的时候执行回调不同的是,bufferevent 在读取或者写入了足够量的数据之后调用用户提供的回调。

2023-08-25 15:18:36 220

原创 libevent源码学习3---事件event

libevent 的基本操作单元是事件。libeventevent_baseevent_base简单来说就是一个已经产生的信号,但是还没有传递给任何进程,此时该信号的状态就称为未决状态。

2023-08-24 22:13:09 211

原创 记一个宏定义写法#define HT_FIND(name, head, elm) name##_HT_FIND((head), (elm))

我相信看完例子你就明白这种写法了。仔细看看是不是这个宏的调用有点像线程定义的写法。最近在看libevent源码,看到一个有趣的宏写法。在vscode鼠标悬停该宏调用处,就清晰明了了。定睛一看是一个宏,##是连接符。

2023-08-24 17:25:09 70

原创 libevent源码学习2---事件循环event_loop

一旦有了一个已经注册了某些事件的 event_base,就需要让 libevent 等待事件并且通知事件的发生。0x010x020x04默认情况下,函数运行event_base其中没有已经注册的事件为止。执行循环的时候 ,函数重复地检查是否有任何已经注册的事件被触发 (比如说,读事件的文件描述符已经就绪,可以读取了;或者超时事件的超时时间即将到达 )。如果有事件被触发,函数标记被触发的事件为 “”,并且执行这些事件。在 flags 参数中设置一个或者多个标志就可以改变的行为。如果设置了。

2023-08-09 19:13:12 279

原创 libevent源码学习1---创建event

Libevent是一个用于开发可扩展性网络服务器的基于事件驱动(event-driven)模型的非阻塞网络库。

2023-08-09 16:08:35 264

原创 ubuntu下载安装libevent

官网上下载最新稳定版本,然后拖到你的linux系统中,解压。或者可是使用wget在线下载。本文下载的是最新版本,其他版本同操作。上述程序,捕捉2号信号,并设置捕捉超时时间5秒。ubuntu下载安装libevent。若出现下面的文件,则安装成功。进入解压后的目录,执行。

2023-08-09 00:31:20 901

原创 C++多线程编程(包含c++20内容)

本文详细介绍c++多线程编程内容(涵盖c++20),内容很全,很详细,全文17000余字。你确定不看看嘛?

2023-07-28 13:10:44 934

原创 Linux系统ubuntu22.04安装最新版的gcc13.1.0编译器,支持c++20、23

Linux系统ubuntu22.04安装最新版的gcc13.1.0编译器,支持c++20、23,本文全程上机实操,包含解决若干个问题,如下载包失败,执行代码/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.31' not found等

2023-07-14 18:52:19 12270 26

原创 C++容器的概述

标准库中的容器是泛型数据结构,特别适合保存数据集合。使用标准库时,几乎不需要使用标准的C风格数组、编写链表或者设计栈。容器实现为类模。除array、bitset外,大部分标准库容器大小灵活多变,都能自动生长或者收缩,以容纳更多的或者更少的元素。和固定大小的C风格数组相比,有着巨大的优势。由于本质的标准C风格数组的大小是固定的,因此容易受到溢出的破坏。如果数据溢出,轻则导致程序崩溃,重则导致某些类型的安全受到攻击。使用标准库容器,程序遇到这种问题的可能性就会小的很多。

2023-07-12 13:18:38 181

原创 解决win10开机卡顿、配置很高但是玩游戏卡顿掉帧等问题

最近组装了一台高配置的新电脑,装好了各种驱动、软件等。发现系统开机后卡顿一分钟左右(加载应用配置等),但是我的系统启动项明明就没多少,不应该是这样的情况,而且会出出现玩游戏卡顿掉帧等情况。前前后后重装系统若干次、重装主板bios、显卡驱动等若干次。directX修复、驱动人等生该用的都用了。下面介绍解决了我这些问题的方法,80%上述问题都可以修复。如果你也出现这些问题,尝试着使用该方法看看可不可以。

2023-06-29 12:34:12 1844

原创 edge设置下载位置失败解决办法

本人使用edge下载软件,已经设置了下载到F盘,但是依然会下载到C盘,设置失败!经过探索,在设置中下载选项中每次下载都询问我该做些什么关闭就可以了。

2023-06-22 21:40:33 492

原创 CCF认证-出现次数最多的数201312-1(c++题解)

CCF认证-出现次数最多的数201312-1(c++题解)

2023-06-14 09:45:52 110

原创 cin输入字符串允许输入空白符

上述代码只能输入一个完整的,不加任何空白字符的字符串。输入中即使带了空白符也是不起作用的,只会输出空白符之前的字符串。有时候我们想输出带空白符的字符串,就像。上述方法虽然可以实现输出空白符后面的字符串,但是空白符被跳过了,所以输出结果是helloworld。本文将介绍几种c++方式的读取空白符的方法。

2023-06-13 15:37:41 1089

原创 变长参数列表

c/c++中提供了语法和一些实现宏,用于编写具有可变数量的函数。这些函数通常看起来像printf()。尽管并非经常需要,但偶尔需要这个特性。例如,假设想编写一个快速调试的函数,如果设置了调试标记,这个函数向stderr输出字符串,但如果没有设置调试标记,就什么都不做。与printf()一样,这个函数应该能接收任意数目和任意类型的参数并输出字符串。首先,注意debugOut()函数的原型包含一个具有类型和名称的参数str,之后是省略号(…),这代表任意数目和类型的参数。如果要访问这些参数,必须使用。

2023-06-11 18:07:19 91

原创 c++20模块导入module

本文主要讲述c++20新增模块内容的详细使用方式。包括编译注意事项、建议点赞收藏

2023-06-11 14:22:47 1045

原创 c++类型转换

本文涵盖所有c++类型转换函数包含c++20最新的内容

2023-06-08 22:06:21 385

原创 纯虚方法和抽象基类

纯虚方法在类定义中显示说明该方法不需要定义。如果将某个方法设置为纯虚方法,就是告诉编译器当前类中不存在这个方法的定义。具有至少一个纯虚方法的类被称为抽象类,因为这个类不能被实例化,不能创建对象。现在SpreadsheetCell就变成了一个抽象类,无法创建对象。如果继承了抽象父类的派生类没有实现全部的纯虚方法,那么派生类也是抽象的,所以同样不能创建派生类对象。纯虚函数声明的语法:声明后面紧跟着=0。不需要编写任何代码。

2023-06-08 16:51:01 43

原创 optional

它还消除了将函数编写为返回代表成功或失败的布尔值的需求,同时将函数的实际结果存储在作为输出参数传递给函数的实参中。保留特定类型的值,或者不包含任何值。c++17引入,如果编译报错,需要加上。如果函数可能返回也可能不返回某些内容,则通常也将。用作函数的返回类型。如果想要允许值是可以选择的,则可以将。是无效的,但是,可以将指针保存在。同时不能将引用保存在。是一个类模板,因此必须在。中指定所需要的类型。注意:如果对于一个空的。

2023-06-08 16:47:47 46

原创 向上转型和向下转型

这也是让方法和函数使用类的引用而不是直接使用类的对象的原因。通过使用引用,派生类在传递的时候没有发生截断。向下转型有时候又是必须的,在可控的环境下可以充分利用这种转换。,以使用对象的内建类型信息,拒绝没有意义的类型转换,这种内建信息通常驻留在虚表中,这意味着。函数的函数都是一个人所写,那么没啥太大问题,毕竟作者自己知道这个函数需要。只能用于具有虚表的对象,即至少有一个虚成员的对象。因为无法保证对象实际上属于派生类,也因为向下转型是不好的设计。,专业的c++程序员一般是不会使用这种转换的。

2023-06-08 15:22:46 391

原创 继承中的父类相关知识

本文主要讲解在继承中关于基类和派生类构造函数和析构函数一些知识点

2023-06-08 14:25:09 229

原创 C++创建稳定的接口-PImpl

Pimpl

2023-05-29 15:17:58 137

原创 记一次老流氓导致的系统蓝屏

使用windbg分析系统蓝屏日志

2023-05-29 13:41:29 115

原创 c++运算符重载

c++运算符重载讲解,非常的详细、非常的nice,建议收藏

2023-05-27 22:41:21 650

原创 vscode设置用户自定义c++代码片段

注意事项:body每一行的内容都是" “符号包裹的,如果需要输出的符号是”,那么需要使用转义字符’ \ '来修饰,如第6行!在json文件输入以下内容,可以自行修改内容。注意下面代码要放到json的{ }内。点击VScode左下角齿轮->点击用户代码片段->输入cpp.json。vscode设置用户自定义c++代码片段。

2023-05-26 17:59:39 247

原创 malloc的底层实现

malloc是C语言中用于动态分配内存的函数,其底层实现通常是由操作系统提供的。

2023-05-26 14:13:40 1060

原创 内存踩踏如何检测

内存踩踏是指程序访问了已经被释放或未分配的内存,这可能导致程序崩溃、数据损坏或安全漏洞等问题。在C++中,检测内存踩踏通常使用以下两种工具

2023-05-26 14:02:11 744

空空如也

空空如也

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

TA关注的人

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