WebServer:buffer

这个应该是最先写的模块,因为缓冲区似乎是独立出来的。

buffer.h

sys/uio.h

这个头文件是Linux系统提供的用于IO操作的头文件,sys表明它是一个系统提供的头文件(类Unix系统提供的系统调用库似乎都是以sys开始的),uio表明它是一个Linux中的IO库(这个u我怀疑是Unix的意思)。
在该文件中,使用了其中的数据结构:

struct iovec { // 意思是io vector
    void  *iov_base;  // 指向缓冲区的指针
    size_t iov_len;   // 缓冲区的长度
};

和关于该数据结构的两个函数:

ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);

使用iovec的好处在于:这两个函数能将一个文件描述符中的数据同时读/写到多个缓冲区中

ssizze_t和size_t的使用

在Buffer中,有很多在平时编写简短代码中不太常见的内容,如:size_tssize_t,这都是为了保证程序的可移植性,使用size_t作为函数返回值是为了和vector的size()匹配,而ssize_t则是因为和系统API进行了交互

ssize_t往往被声明为signed int

函数编写建议

因为上面这些小知识点,我们就能够得到一个结论:

  1. ssize_t:用于需要表示负值的场景,通常与系统API交互时,特别是在处理可能失败的操作和错误码时。
  2. size_t:用于处理不可能是负数的情况,如数组大小、容器容量和索引。

如果在编写程序的时候能够注意这些小问题,就能够提高我们编写的程序的可移植性。

关于调用系统调用

这个问题是源于Buffer的读写函数中:

ssize_t ReadFD(int fd, int* Errno);
ssize_t WriteFD(int fd, int* Errno);

[!问题描述]
系统调用不是会自动对一个全局变量errno进行设置吗?为什么这里还需要传入一个由我们维护的int* Errno

这是因为errno是一个全局变量,WebServer是一个多线程程序,在多线程中,直接使用errno很容易就会产生数据竞争的问题,而在单线程中,我们直接使用errno是没问题的

atomic的使用

C++参考手册其中有对atomic的详细描述,包括了C++20的,WebServer使用的标准好像是C++14,并没有用到20。

atomic的操作其实不算多:

#include <atomic>
std::atomic<int> example(100); // 定义一个int类型的atomic变量,并且将其值初始化为100
exampe = store(50); // 将值原子地变更为50
int value = example.load() // 读取值

以上是比较基础的用法,还有exchange()compare_exchange_weak()compare_exchange_strongis_lock_free()我这没说,我看了下感觉我用不上。

断言的使用

#include <cassert>
assert(condition);

当传入的condition为false的时候,断言就会被触发,它会调用abort()函数,终止程序的运行

assert的行为是可以被控制的,若是不想更改代码,同时又不希望assert被使用,可以定义一个宏:#define NDEBUG

在宏NDEBUG被声明的时候,assert不会被启用,即使它在2代码中被使用,也不会有任何行为。

这里我就发现很有意思的一点:

#define NDEBUG

#include <assert.h>

这种情况下,NDEBUG才是有效的;若是define的声明在头文件导入之后,这个宏就不会起作用了,这是因为在头文件定义的时候就定义了这一点,我看了下asseert.h中的内容,发现了如下两行:

If NDEBUG is defined, do nothing.
If not, and EXPRESSION is zero, print an error message and abort.

其中就提到了NDEBUG的用法。

这个现象的解释就是在include之后它会检查之前是否有define过该宏。

vector中的clear()

void Buffer::RetrieveAll() {
    // bzero(&buffer_[0], buffer_.size());
    /*
      原版使用的是上面的注释部分
      但是这部分GPT说已经不建议使用了
      因为不符合C语言的编写标准
    */
    memset(&buffer_[0], 0, buffer_.size());

    readPos_ = 0;
    writePos_ = 0;
}

迭代器的更深入理解

C++参考手册中说到:迭代器就是更为广义上的指针。所以它的使用和指针其实差不多,但是为什么我会写这个呢?

char* Buffer::BeginPtr_() {
    return &*buffer_.begin();
}

主要是这段代码在我一开始看的时候感觉有点莫名其妙,有点不是很理解为什么要这么写。但现在就能较好的说明它了:

[!解释]
对于begin()都很清楚返回值是一个迭代器,而迭代器是一个抽象的指针,它重载了指针的所有操作(解引用和取地址),并且效果和操作指针是一样的,但是迭代器毕竟不是指针。

arr.begin()就是获得arr的首部迭代器,而对其进行解引用就是获得arr的首部值,即:arr[0],再对其解引用就得到了头部的地址

string.data()

这个函数我一直都没怎么用过,因为我觉得这部分直接使用C语言的写法会更好一点,data()获得的是string的首部元素的地址,具体如下:

void Buffer::Append(const std::string& str) {
    Append(str.data(), str.size());
}

其实这段代码如果是我要写的话我应该会直接写&str[0],但是从代码的编写规范来说,我的写法是不那么“现代化C++”的,所以还是使用data()更好点。

static_cast

static_cast本身不会丢弃原对象的const和volatile属性

const int num = 10;
int temp = static_cast<int>(num);
temp = 12;

这里涉及到两个知识点:

  • static_cast 只是类型转换:
    • static_cast 进行的是类型转换,并不改变原始数据的 const 限制。它只是将 num 的值传递到 temp 中,temp 在这个过程中并不继承 const 限制。
  • const 限制在原始对象中有效:
    • const 限制仅对原始对象有效。在上面的例子中,num 是 const,所以你不能修改 num。但 temp 是一个新的 int 变量,它不受 num 的 const 限制影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/881202.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【GVINS】

【GVINS】 1. GVINS的系统特点2. GVINS的融合导航存在问题3. GVINS的信号的组成4. GVINS的信号的组成 原理推导知乎 1. GVINS的系统特点 概述了一种名为GVINS的系统&#xff0c;它旨在解决视觉-惯性里程计&#xff08;VIO&#xff09;在长时间运行时出现的漂移问题。GVINS通过…

三菱变频器Modbus-RTU 通讯规格

能够从变频器的 RS-485 端子使用 Modbus-RTU 通讯协议&#xff0c;进行通讯运行和参数设定。 NOTE: 1、使用 Modbus-RTU 通讯协议时&#xff0c;请设定Pr.549 协议选择 “1” 2、从主机按地址0(站号0)进行hodbus-RTU通讯时&#xff0c;为广播通讯&#xff0c;变频器不向主机发…

软件设计画图,流程图、甘特图、时间轴图、系统架构图、网络拓扑图、E-R图、思维导图

目录 一、流程图 二、甘特图 三、时间轴图 四、系统架构图 五、网络拓扑图 六、E-R图 七、思维导图 一、流程图 是一种用符号表示算法、工作流或流程的图形。用不同的图形表示不同含义&#xff0c;如椭圆表示开始和结束、菱形表示判断等。 画图工具WPS office 应用市场…

idea启动oom了解决

解决 Error:java: java.lang.OutOfMemoryError: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:///D:/mingan/pb/backend/src/main/java/com/cy/backend/service/impl/StorageServiceImpl.java]]pos36199: WrappedJavaFileObject[org.jetbrains.jps.j…

松材线虫目标检测数据集,12522张图-纯手工标注

松材线虫目标检测数据集&#xff0c;12522张图像&#xff0c;专家纯手工标注。 松材线虫目标检测数据集 数据集描述 该数据集是一个专门用于松材线虫&#xff08;Bursaphelenchus xylophilus&#xff09;检测的数据集&#xff0c;旨在帮助研究人员和开发者训练和评估基于深度…

地平线4登录xbox后提示需要登录档案怎么解决

这个游戏是真nt&#xff08;在联机上&#xff09;&#xff0c;典型搞联机2小时游玩半小时&#xff0c;多半时间都花费在联机上了&#xff0c;不是为了联机和朋友跑车&#xff0c;早给他卸载了。 本人的游戏问题&#xff1a;看了一些视频感觉没什么作用&#xff0c;我的现象就是…

gcc配合cython编译python源代码

以前我们一般用Nuitka或者Pyinstaller来将python源码编译成二进制可执行文件。今天我们学习如何直接用gcc来编译。 很简单的一个python程序&#xff0c;结构如下。包含一个model.py和main.py 步骤1&#xff1a;处理main.py 处理main.py。即主程序入口 cython -D -2 --embe…

BGP 路由反射器

转载&#xff1a;BGP 路由反射器 / 实验介绍: / 原理概述 缺省情况下&#xff0c;路由器从它的一个 IBGP 对等体那里接收到的路由条目不会被该路由器再传递给其他IBGP对等体&#xff0c;这个原则称为BGP水平分割 原则&#xff0c;该原则的根本作用是防止 AS 内部的 BGP 路由…

化学分子结构检测系统源码分享

化学分子结构检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

CleanClip For Mac 強大的剪貼簿助手Paste替代工具 v2.2.1

软件介绍&#xff1a; CleanClip是一款专为Mac设计的强大剪贴板管理工具&#xff0c;旨在提升用户的工作效率和生产力。这款应用完全采用原生Swift编写&#xff0c;为Mac用户提供了流畅、快速且直观的使用体验。CleanClip不仅支持文本内容的管理&#xff0c;还能处理图片、文件…

C++11——lambda

lambda lambda的介绍lambda的使用lambda的细节->捕捉列表 lambda的介绍 lambda是匿名函数&#xff0c;再适合的场景去使用可以提高代码的可读性。 场景&#xff1a; 假设有一个Goods类需要进行按照价格、数量排序 class Goods {string name;size_t _price;//价格int num;/…

攻击者将恶意软件分解成小块并绕过您的安全网关

近二十年来&#xff0c;安全 Web 网关 (SWG) 一直用于监控网络流量、拦截恶意文件和网站以及保护企业免受 Web 威胁。 如今&#xff0c;许多企业都相信他们的 SWG 能够捕获所有已知恶意软件&#xff0c;正如其 SLA &#xff08;服务质量保证&#xff09;中所承诺的那样。 然而…

Docker 里面按照ifconfig

1. 进入Docker 容器内部 docker exec -it xxx bash2. 安装 net-tools iputils-ping apt-get update && apt-get install -y net-tools apt-get update && apt-get install -y iputils-ping 3. 执行ifconfig 执行ping

WebLogic 后台弱⼝令GetShell

漏洞描述 通过弱⼝令进⼊后台界⾯ , 上传部署war包 , getshell 影响范围 全版本&#xff08;前提后台存在弱⼝令&#xff09; 环境搭建 cd vulhub-master/weblogic/weak_password docker-compose up -d 漏洞复现 默认账号密码&#xff1a;weblogic/Oracle123 weblogic…

ChatCADChatCAD+:Towards a Universal and Reliable Interactive CAD using LLMs

ChatCAD&#xff08;论文链接&#xff1a;[2302.07257] ChatCAD: Interactive Computer-Aided Diagnosis on Medical Image using Large Language Models (arxiv.org)&#xff09; 网络流程图&#xff1a; 辅助阅读&#xff1a; 基于大型语言模型的医学图像交互式计算机辅助诊…

数据结构--双链表

目录 一、引言 二 、链表的分类 1.单向或双向 2.带头或不带头 3.循环或不循环 三、双链表的概念与基本结构 1.概念 2.基本结构 三、双链表的常见操作 1.创建节点 2.初始化 3.头插 4.尾插 5.头删 6.尾删 7.打印 8.查找 9.插入节点 10.删除节点 11.销毁链…

gin配置swagger文档

一、基本准备工作 1、安装依赖包 go get -u github.com/swaggo/swag/cmd/swag go get -u github.com/swaggo/gin-swagger go get -u github.com/swaggo/files2、在根目录上配置swagger的路由文件 //2.初始化路由router : initialize.Routers()// 配置swaggerdocs.SwaggerInfo…

京东商品属性的详细api数据解析:颜色、尺寸与材质

京东&#xff08;JD.com&#xff09;作为一个大型电商平台&#xff0c;其商品信息通过API接口提供给开发者或第三方服务使用&#xff0c;以便进行商品搜索、展示、分析等操作。然而&#xff0c;直接访问京东的详细商品属性&#xff08;如颜色、尺寸、材质等&#xff09;API通常…

uniapp|微信小程序 实现输入四位数 空格隔开

<template><page-meta :page-style"cssVar"></page-meta><view class"container"><u-navbartitle"优惠券兑换"placeholderbgColor"#fff":autoBack"true":titleStyle"{fontFamily: SourceHa…

Maven Helper 插件

推荐指数&#xff1a;★★★★★ 分析依赖冲突插件 Maven Helper插件就可免去命令行困扰。通过界面解决依赖冲突。 点击此按钮&#xff0c;切换到此工具栏 可进行相应操作&#xff1a; Conflicts&#xff08;查看冲突&#xff09;All Dependencies as List&#xff08;列表形…