当前位置: 首页 > news >正文

More Effective C++:改善编程与设计(上)

More Effective C++

目录

More Effective C++:

条款1:仔细区别pointers和 references

条款2:最好使用C++转型操作符

条款3:绝对不要以多态方式处理数组

条款4:非必要不要提供default constructor

条款5:对定制的“类型转换函数”保持警觉

条款6:区别increment/decrement操作符的前置和后置形式

条款7:千万不要重载&&,||和,操作符

条款8:了解各种不同意义的new和delete

条款9:利用destrucotors避免泄漏资源

条款10:在constructors内阻止资源泄漏

条款11:禁止exception流出destructors之外

条款12:了解“抛出一个exception”与“传递一个参数”或“调用一个虚函数”之间的差异

条款13:以by reference方式捕捉exceptions

条款14:明智运用exception specifications

条款15:了解异常处理的成本

条款16:谨记80-20法则

条款17:考虑使用lazy evaluation

条款18:分期摊还预期的计算成本


条款1:仔细区别pointers和 references

        引用不存在空引用,而指针可以存在空指针,并且指针的值是可以修改的,但是引用总是会代表某个对象。
        结论:当你知道需要指向某个东西,而且绝不会改变指向其他东西,或者当你实现一个操作符而其语法需求无法用指针达成,比如:operator */operator [],你应该选择引用,其他时候请采用指针。

条款2:最好使用C++转型操作符

        C语言旧式转型允许你将任何类型转换为任何其他类型,并且难以辨识,为此C++引入四个转型操作符:
static_cast,
reinterpret_cast,
const_cast,
dynamic_cast
        过去的(type)expression 应该改为 static_cast<type>(expression) ;
        四个转型操作符已经在前面讲过,现在来总结一下应用场景:
  • static_cast:可以进行类型具有一定相关性的转换,以及不涉及继承机制的类型执行转型动作;
  • const_cast:用来改变表达式中的常量性或变易性;
  • dynamic_cast:用来执行继承体系中“安全的向下转型或跨系转型动作”,如果转型成功则是正常指针,失败会以一个空指针或者异常表现出来,但是只能用于继承体系中,无法应用在缺乏续虚函数的类型上,也不能改变常量性
  • reinterpret_cast:通常用于函数指针转型动作,并不具备移植性,慎用!

条款3:绝对不要以多态方式处理数组

        假如你有一个class BST以及一个继承自BST的class BalancedBST,如果你将一个BalancedBST对象所组成的数组交给一个BST类型的变量进行打印,编译能够通过,但是当你试图用opearator []去访问数组时会出现问题,指针会假设访问的对象每一个都是BST的大小,但实际上每一个元素大小是BalancedBST的大小,由于派生类比基类占用的空间更大,因此访问出错。
总结:多态和指针算术不能够混用,数组对象几乎总是会涉及指针的算术运算,所以数组
和多态不要混用。

条款4:非必要不要提供default constructor

        在类中到底需不需要提供默认构造函数呢?这取决于具体情况,一方面如果要求类可以合理地从无到有生成对象,并且要依赖于模版,亦或是要实现一个虚基类,那么就需要提供默认构造函数;但如果必须有某些外来信息才能生成对象的类,则不需要提供默认构造函数,因为构造出来对象包含没有任何意义的值,无意义的默认构造函数也会影响代码运行效率,视情况而定。

条款5:对定制的“类型转换函数”保持警觉

        C++允许编译器在不同类型之间支持隐式类型转换,可以通过两种函数实现:
单参数构造函数以及隐式类型转换操作符,
        后者更加容易引发问题:形如operator 类型名称函数,它的出现可能导致错误的函数调用:
Rational r(1,2); count<<r;
你希望打印出r的信息,但是如果没有提供operator <<却提供了operator double,那么编
译仍会通过,但打印出的却不是期望信息。
总结:只要不声明隐式类型转换操作符即可解决,对于单参数构造函数建议使用explicit关键字来避免隐式类型转换,同时支持显式转换。

条款6:区别increment/decrement操作符的前置和后置形式

        C++扩充了++和—操作符的两种形式:
UPInt& operator++(); 前置式;
const UPInt operator++(int); 后置式;
UPInt& operator—(); 前置式;
const UPInt operator—(int); 后置式;
        后置式的int参数的唯一目的是为了区别前置式和后置式,并且返回const UPInt,这是为了
防止++++的情况发生,使用时应该尽可能使用前置式。

条款7:千万不要重载&&,||和,操作符

        原因如下:C++对于真假值表达式采用“骤死式”评估方式,在&&和||操作符左边的表达
式的真假值一旦确定即使右边的表达式尚未检验,整个语句结束,但是一旦你重载了操作符函
数,两边的表达式都需要完成评估,不仅如此,还无法确定评估顺序。至于,同样如此,你绝
对无法保证左侧的表达式一定比右侧的表达式更早被评估。
总结:如果你将它们重载,就没有办法提供程序员预期的某种行为模式,所以请不要重载
这三个操作符函数。

条款8:了解各种不同意义的new和delete

        在你new一个类型的时候,这种操作被称为new operator,会进行两件事情:
        1.调用operator new来分配足够的内存;
        2.调用构造函数,为分配的内存中的那个对象呢设定初始值。
        介绍一下operator new: void* operator new(size_t size);你可以将其重载。
        当你需要在已经分配好的原始内存上构建对象,那么可以使用定位new(Placement new):
        假设A为一个类,如果要在已经有地址为buffer的内存上构建size个对象,可以这样:
A* constructor(void* buffer,size_t size)
{return new(buffer)A(size);
}
        你可以理解为定位new的作用就是将获得的指针再返回,来作为放置的地址,定位new会去
调用operator new,看起来像这样:
void* operator new(size_t,void* location)
{return location;
}
        这里的size_t参数没有用到但一定要有,
小总结:如果你希望将对象产生于堆,使用new operator,如果你只是打算分配内存,使用operator new,如果你打算自己决定内存分配方式,可以重载一个operator new,如果你打算在已分配的内存中构造对象,使用placement new,它会去调用构造函数。
        在你delete一个类型的时候,这种操作被称为new delete,会进行两件事情:
        1.调用析构函数;
        2.调用operator delete释放内存,
        如果你使用placement new,你应该避免使用delete operator,因为它会调用operator delete来释放内存,但是起初内存不是由operator new得来的,你应该直接调用该对象的析构函数。
补充:如果是new一个数组,那么会调用operator new[],再依次调用构造函数,delete []
时会依次调用析构函数,最后调用operator delete[]。

条款9:利用destrucotors避免泄漏资源

        当你在一个函数中实例化一个类后,你想要调用类中的函数并delete掉它,但如果函数调用
时抛出了exception,那么delete语句会被跳过,造成内存泄露, 因此你通常可以通过捕获执行
函数的异常来在throw语句之前执行delete语句,还可以使用智能指针 :采用RAII资源获取即初 始化的思想,将资源封装在对象内,通常可以在exceptions出现时避免泄漏资源。

条款10:在constructors内阻止资源泄漏

        如果你设计的类中constructors调用了new,在构造时申请空间失败,抛出了一个
exception会怎么样呢?C++只会析构已经构造完成的对象,现在constructor没有执行完毕,
不会调用类中的析构函数,会发生内存泄露,解决办法可以如下: 将所有exception捕捉起
来,执行某种清理工作,然后重新抛出exception,而执行清理工作不必刻意进行,可以使用
智能指针来管理资源。

条款11:禁止exception流出destructors之外

        在destructors中抛出异常,会导致资源释放不完全,导致内存泄露,并且如果没有try…
catch语句捕捉异常,会导致terminate函数在exception传播过程中的栈展开机制中被调用,
程序立即终止。

条款12:了解“抛出一个exception”与“传递一个参数”或“调用一个虚函数”之间的差异

        “传递对象到函数去,或是以对象调用虚函数”和“将对象抛出成为一个exception”之间,有
三个主要的差异。
  • 第一,exception object总是会被复制,不论是自定义类型,内置类型或是静态类型,catch端捕捉的永远是throw端的副本,发生修改也只会影响到副本,如果以by value的方式捕捉,甚至会被复制两次。但是传递给函数参数的对象则不一定得复制。
  • 第二,“被抛出成为exception的对象,其被允许的类型转换动作,比“被传递到函数去”的对象少。
  • 第三,catch子句以其“出现于源代码的顺序”被编译器检验比对,其中第一个匹配成功者便执行;而当我们以某对象调用一个虚函数,被选中执行的是那个“与对象类型最佳吻合”的函数,不论它是不是源代码所列的第一个。

条款13:以by reference方式捕捉exceptions

        exception objects有三种方式传递到子句:by pointer,by value,by reference
        如果是by pointer,类似这样: static exception ex; throw &ex; 但是往往掉了static会使得指针指向不复存在的对象,即便是正确接收,那么是否应该调用delete?对于分配于heap的指针没有问题,其他则会招致未受定义的程序行为,所以无论如何必须以by value或by reference的方式捕捉它们。  
Catch-by-value中每当exception object被抛出,就会被复制两次,此外也会引起切割问题,将throw端的派生类切割赋值给catch端时,catch端将失去原派生类的派生成分,并且无法触发多态,重写的虚函数不能发挥作用。 Catch-by-reference,不会发生对象删除问题,没有切割问题,而且exception object也只会被复制一次, 也可以正常出发多态调用,所以强烈建议使用Catch exceptions by reference!

条款14:明智运用exception specifications

        异常声明确实对于“函数希望抛出什么样的exceptions”提供了卓越的说明,但是编译器允
许你调用“可能违反当前函数本身的异常声明”的函数,并且由于如此的调用行为可能导致程序
被迫中止,为了unexpected函数被调用有三个做法:
  • 不应该将templates和exception specifications混合使用;
  • 函数内调用函数无异常声明,那么函数本身也不应该有异常声明;
  • 处理系统可能抛出的exceptions,异常声明是一把双面刃,请谨慎使用!

条款15:了解异常处理的成本

        exception的处理机制首先需要付出 一些空间 来放置某些数据结构(记录哪些对象已被完全
构造妥当)和 一些时间 ,随时保持那些数据结构的正确性;其次try语句块和异常声明需要的成
本相似,对于这块,你只需要了解异常的处理需要消耗部分性能即可。

条款16:谨记80-20法则

        法则内容: 一个程序80%的资源用于20%的代码上, 重点在于:软件的整体性能聚会总是
由其构成要素的一小部分决定。为了提升程序的性能,你可以使用程序分析器或者尽可能使用
最多的数据来分析软件,专注于特别耗时的地方来加以改善。

条款17:考虑使用lazy evaluation

        缓式评估可以在多种场合派上用场:
  • Reference Counting(引用计数):举例string的写时拷贝,如果任何拷贝赋值都采用深拷贝,这就是急式评估,会消耗很多空间,但如果采用数据共享,使用引用计数的方式管理内存,直到字符串需要被修改发生深拷贝就可以节省大量空间。
  • 区分读和写:以string为例,如果只是读取就不需要进行深拷贝,但如果要写入则需要
  • Lazy Fetching(缓式取出):如果想要引入大型对象,只需产生该对象的外壳,不从磁盘中读取任何字段数据,当对象内的某个字段被需要了,程序才从数据库中取回对应的数据
  • Lazy Expression Evaluation(表达式缓评估):如果用m3来表示大型对象m1和m2的某种运算结果,可以用m3来存储一个数据结构,包含两个指针和一个enum,前者指向m1和m2,后者用来指示运算动作是什么,如果在m3被使用之前,被赋予了新的值,或者接受另一个复杂运算结果,那么就节省了运算m1和m2的成本。
注意:缓式评估并不会影响到必需的对象复制,如果计算是必要的,缓式评估并不会为你的程序节省任何工作,只有当计算可以被避免时,缓式评估才会发挥真正的用处。

条款18:分期摊还预期的计算成本

        这里用到的思想是:over-eager evaluation,如果你预期程序常常会用到某个计算,你可
以降低每次计算的平均成本,办法就是设计一份数据结构以便能够极有效率的处理需求。
        其中一个简单做法就是“将已经计算好而可能再次被需要”的数值保留下来,方便下一次拿取来降低平均成本,称之为Caching;还有将数组扩容时,将空间调整到所需大小更大一些的做法,被称为Prefetching 前者会消耗较多内存,但可以降低那些已被计算出的结果重新计算的时间,后者需要一些空间来放置被预先取出的东西,但可降低访问它们所需的时间。

相关文章:

More Effective C++:改善编程与设计(上)

More Effective C&#xff1a; 目录 More Effective C&#xff1a; 条款1&#xff1a;仔细区别pointers和 references 条款2:最好使用C转型操作符 条款3:绝对不要以多态方式处理数组 条款4:非必要不要提供default constructor 条款5:对定制的“类型转换函数”保持警觉 …...

SCDN如何有效防护网站免受CC攻击?——安全加速网络的实战解析

在互联网安全威胁日益复杂化的今天&#xff0c;CC&#xff08;Challenge Collapsar&#xff09;攻击已成为网站运营者面临的主要挑战之一。这种攻击通过模拟大量合法用户请求&#xff0c;消耗服务器资源&#xff0c;导致正常用户无法访问。而**安全内容分发网络&#xff08;SCD…...

关于并发编程AQS的学习

目录 1. AQS的核心作用 2. AQS的核心结构 3. 关键方法 4. AQS的应用示例 4.1、ReentrantLock的实现 4.2、CountDownLatch的实现 5. AQS的优势 6. 对比其他同步机制 前言 AQS&#xff08;AbstractQueuedSynchronizer&#xff09; 是Java并发编程中一个核心的同步器框架…...

16S18S基础知识(1)

相关内容&#xff1a; https://blog.csdn.net/weixin_34315189/article/details/86397125?fromshareblogdetail&sharetypeblogdetail&sharerId86397125&sharereferPC&sharesource2302_80012625&sharefromfrom_link https://metagenome.blog.csdn.net/art…...

Java Spring Boot 控制器中处理用户数据详解

目录 一、获取请求参数1.1 获取查询参数1.2 获取路径参数 二、处理表单提交2.1 处理表单数据 三、处理 JSON 数据3.1 接收 JSON 数据 四、返回 JSON 数据五、处理文件上传5.1 单文件上传5.2 多文件上传 六、总结 在 Spring Boot 应用开发中&#xff0c;控制器&#xff08;Contr…...

AI产品上市前的“安全通行证“

首席数据官高鹏律师团队 如今AI 产品如雨后春笋般涌现&#xff0c;从智能音箱到自动驾驶汽车&#xff0c;从语音助手到医疗诊断软件&#xff0c;它们正全方位渗透进我们的生活。然而&#xff0c;在 AI 产品迈向市场、走进千家万户之前&#xff0c;有一系列强制性安全认证如同坚…...

sql server 2019 将单用户状态修改为多用户状态

记录两种将单用户状态修改为多用户状态&#xff0c;我曾经成功过的方法&#xff0c;供参考 第一种方法 USE master; GO -- 终止所有活动连接 DECLARE kill_connections NVARCHAR(MAX) ; SELECT kill_connections KILL CAST(session_id AS NVARCHAR(10)) ; FROM sys.dm_ex…...

[滑动窗口]越短越合法(可转化成越长越合法)

题目链接 题意 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回子数组内所有元素的乘积严格小于k 的连续子数组的数目。 首先当ans增加时 我们认为r固定 方法一、转化成越长越合法 思路 算出乘积 ≥ k \ge k ≥k的子数组数量 再用所有子数组数量减去上面算出来…...

idea中编写spark程序

### 在 IntelliJ IDEA 中配置和编写 Spark 程序 要在 IntelliJ IDEA 中高效地开发 Spark 程序&#xff0c;需要完成一系列必要的环境配置以及项目搭建工作。以下是详细的说明。 --- #### 1. 安装与配置 IntelliJ IDEA 为了确保 IDE 可以支持 Scala 开发&#xff0c;首先需要…...

机器学习入门(一)

机器学习入门&#xff08;一&#xff09; 文章目录 机器学习入门&#xff08;一&#xff09;一、机器学习分类1.1 监督学习1.2 半监督学习1.3 无监督学习1.4 强化学习 二、scikit-learn工具介绍scikit-learn安装 三、数据集3.1 sklearn玩具数据集介绍3.2 sklearn现实世界数据集…...

力扣每日一题之移动零

题目说明&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 思路分析&#xff1a;我们可以考虑使用双指针来解答该题。双指针分…...

GaiaEx 盖亚:从合规出发,一家新兴交易平台的全球化路径探索

在加密货币交易平台日益激烈的竞争中&#xff0c;监管趋严、安全要求提升、用户体验优化已成为行业发展的三大核心议题。2025年初正式上线的GaiaEx 盖亚交易所&#xff0c;正是在这一市场背景下&#xff0c;以“合规 产品 生态”的多维路径&#xff0c;逐步建立起自身的发展方…...

车载网关--- 职责边界划分与功能解耦设计

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

EasyRTC嵌入式音视频通信SDK打造带屏IPC全场景实时通信解决方案

一、方案概述​ 在智能安防与物联网快速发展的背景下&#xff0c;带屏IPC&#xff08;网络摄像机&#xff09;不仅承担着视频采集与监控的基础功能&#xff0c;还逐渐向多样化交互与智能化方向演进。EasyRTC作为一款强大的实时通信框架&#xff0c;具备低延迟、高稳定性、跨平…...

STM32入门笔记(05):内部高速8Mhz时钟最大时钟可以设置 64 Mhz?如何修改system_stm32f10x.c里面的代码?

6.2 Clocks 最大系统时钟频率 当 STM32F103 系列仅使用内部高速振荡器&#xff08;HSI&#xff0c;8 MHz&#xff09;作为时钟源&#xff0c;并通过 PLL 放大时&#xff0c;最大可达 64 MHz。([forum.mikroe.com][1], [keil.com][2]) HSI 被内部除以 2&#xff08;即 4 M…...

iOS 阅后即焚功能的实现

iOS阅后即焚功能实现步骤 一、功能设计要点 消息类型支持&#xff1a;文本、图片、视频、音频等。销毁触发条件&#xff1a; 接收方首次打开消息后启动倒计时。消息存活时间可配置&#xff08;如5秒、1分钟&#xff09;。 安全要求&#xff1a; 端到端加密&#xff08;E2EE&a…...

二叉树前中后序遍历统一迭代法详解:空标记法与栈操作的艺术

二叉树的 前序、中序、后序 遍历是算法中的经典问题。递归实现简单直观&#xff0c;而迭代法则能更好地理解栈的操作逻辑。前文中(中序&#xff0c;前序与后序&#xff09;所讲过传统的迭代法需要为每种遍历设计不同的入栈顺序&#xff0c;但 统一迭代法 通过引入 空标记节点&a…...

Spark 集群配置、启动与监控指南

Spark 集群的配置和启动需要几个关键步骤。以下是完整的操作流程&#xff0c;包含配置修改、集群启动、任务提交和常见错误排查方法。 1. 修改 Spark 配置文件 首先需要编辑 Spark 配置文件&#xff0c;设置集群参数&#xff1a; bash # 进入 Spark 配置目录 cd $SPARK_HOM…...

综述:拓扑材料的热磁性质

Adv. Funct. Mater. 2025, 2506631 https://doi.org/10.1002/adfm.202506631 近年来&#xff0c;越来越多的拓扑材料表现出优异的热磁&#xff08;TM&#xff09;性能&#xff0c;其显著的双极效应和线性能带带来的高载流子迁移率改善了这种性能。 本文综述了TM输运理论、基于…...

lanqiaoOJ 652:一步之遥 ← 扩展欧几里得定理

【题目来源】 https://www.lanqiao.cn/problems/652/learning/ 【题目背景】 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 【题目描述】 从昏迷中醒来&#xff0c;小明发现自己被关在X星球的废矿车里。矿车停在平直的废弃…...

双目云台摄像机:双摄安防功能全方位

双目云台摄像机是一种具有革命性设计的云台摄像机设备&#xff0c;其核心在于其独特的双摄像头配置。以下是对这种先进安防设备的详细介绍&#xff1a; 一、核心原理 双目云台摄像机的核心原理在于利用两个摄像头从不同角度捕捉同一场景&#xff0c;通过先进的算法计算两个图…...

Linux - 基础指令

目录 linux下基本指令 ls pwd cd touch mkdir rmdir rm man cp mv cat ​more less head tail | 匿名管道 find 指令 which alias grep zip/unzi rz/sz tar 重要的⼏个热键 学习linux操作系统&#xff0c;学习指令是必不可少的 尽管有图形化的linux操作系统供学者学习&am…...

深圳无人机展览即将开始,无人机舵机为什么选择伟创动力

深圳无人机展览即将开始&#xff0c;无人机舵机为什么选择伟创动力 2025年5月23日至25日&#xff0c;伟创动力(Kpower)将携旗下多款高性能舵机及微型驱动系统方案亮相2025国际低空经济与无人系统博览会&#xff08;深圳无人机展&#xff09;&#xff0c;全面展示其在无人机、机…...

ajax提交form表单数据举例

目录 一、HTML 表单准备二、JavaScript 文件(form.js)三、服务器端处理(Spring Boot 示例)四、运行和测试五、总结在现代 Web 开发中,为了提供更流畅、无需页面刷新的用户体验,AJAX(Asynchronous JavaScript and XML)技术被广泛应用于提交表单数据。本文将通过一个具体…...

IDEA 新建 SpringBoot 项目时,没有高版本 SpringBoot 可选

环境描述 IDEA 2025.1.1JDK17Maven 3.9.9 问题描述 IDEA 新建 SpringBoot 项目时&#xff0c;没有高版本 SpringBoot 可选&#xff0c;可以看到此时的最高版本为 3.0.2&#xff1a; 问题分析 返回上一步&#xff0c;可以发现 Spring Initializr 的服务地址为阿里云&#…...

下载的旧版的jenkins,为什么没有旧版的插件

下载的旧版的jenkins&#xff0c;为什么没有旧版的插件&#xff0c;别急 我的jenkins版本&#xff1a; 然后我去找对应的插件 https://updates.jenkins.io/download/plugins/ 1、Maven Integration plugin&#xff1a; Maven 集成管理插件。 然后点击及下载成功 然后 注意&…...

java连数据库

一、准备工作 ​​安装MySQL数据库​​ 确保已安装MySQL服务器并启动服务 ​​下载JDBC驱动​​ 官方驱动&#xff1a;MySQL Connector/JMaven依赖&#xff1a; <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactI…...

常见排序算法及其java实现

常见排序算法 一、冒泡排序&#xff08;Bubble Sort&#xff09;​二、选择排序&#xff08;Selection Sort&#xff09;​​ ​​三、插入排序&#xff08;Insertion Sort&#xff09;​​四、快速排序&#xff08;Quick Sort&#xff09;​​ ​​五、归并排序&#xff08;Me…...

【Python 算法零基础 2.模拟 ④ 基于矩阵】

目录 基于矩阵 Ⅰ、 2120. 执行所有后缀指令 思路与算法 ① 初始化结果列表 ② 方向映射 ③ 遍历每个起始位置 ④ 记录结果 Ⅱ、1252. 奇数值单元格的数目 思路与算法 ① 初始化矩阵 ② 处理每个操作 ③ 统计奇数元素 Ⅲ、 832. 翻转图像 思路与算法 ① 水平翻转图像 ② 像素值…...

2025年PMP 学习十三 第9章 项目资源管理(9.1,9.2)

2025年PMP 学习十三 第9章 项目资源管理&#xff08;9.1,9.2&#xff09; 序号过程过程组9.1规划资源管理规划9.2估算活动资源规划9.3获取资源执行9.4建设团队执行9.5管理团队执行9.6控制资源监控 文章目录 2025年PMP 学习十三 第9章 项目资源管理&#xff08;9.1,9.2&#xf…...

IEEE802.16 标准介绍

IEEE802.16 标准又称为IEEE Wireless MAN 空中接口标准&#xff0c;对工作于不同频带的无线接入系统空中接口进行了规范。由于它所规定的无线系统覆盖范围在公里量级&#xff0c;因此802.16 系统主要应用于城域网。 根据使用频带高低的不同&#xff0c;802.16 系统可分为应用于…...

Nginx配置与应用案例详解

Nginx 是一款高性能的 HTTP 服务器和反向代理服务器,广泛用于负载均衡、静态资源托管和动态内容转发。以下是对 Nginx 配置的详细解析及常见应用场景案例。 一、Nginx 配置文件结构 Nginx 的配置文件通常位于 /etc/nginx/nginx.conf,包含以下核心模块: 全局块 (Main Contex…...

Hadoop-HDFS-Packet含义及作用

在 HDFS&#xff08;Hadoop Distributed File System&#xff09;中&#xff0c;Packet 是数据读写过程中用于数据传输的基本单位。它是 HDFS 客户端与数据节点&#xff08;DataNode&#xff09;之间进行数据交互时的核心概念&#xff0c;尤其在写入和读取文件时&#xff0c;Pa…...

作业帮Android面试题及参考答案

简单描述 Java 类加载机制 Java 类加载机制是将类的字节码载入 JVM 并生成对应的 Class 对象的过程&#xff0c;主要包括以下几个阶段。 加载是类加载的第一个阶段&#xff0c;通过类的全限定名来获取其字节码流&#xff0c;然后将字节码流解析成方法区中的运行时数据结构&…...

分布式1(cap base理论 锁 事务 幂等性 rpc)

目录 分布式系统介绍 一、定义与概念 二、分布式系统的特点 三、分布式系统面临的挑战 四、分布式系统的常见应用场景 CAP 定理 BASE 理论 BASE理论是如何保证最终一致性的 分布式锁的常见使用场景有哪些&#xff1f; 1. 防止多节点重复操作 2. 资源互斥访问 3. 分…...

如何下载 MySQL 驱动 JAR 包

下载 MySQL 驱动 JAR 包的 4 种方式&#xff1a; 官网下载&#xff1a;从 MySQL 官网 下载对应版本的 ZIP 包Maven&#xff1a;在 pom.xml 添加 mysql-connector-java 依赖Gradle&#xff1a;在 build.gradle 使用 implementation mysql:mysql-connector-java:8.0.x直接下载&a…...

unordered_map和unordered的介绍和使用

目录 unordered系列关联式容器 unordered_map unordered_map的接口说明 unordered_map的定义方式 unordered_map接口的使用 unordered_map的容量 unordered_map的迭代器 unordered_map的元素访问 unordered_map的查询 unordered_map的修改操作 unordered_multimap u…...

【原创】使用阿里云存放一个临时共享的文件

在某些场合&#xff0c;需要临时将一个文件存储到一个可被公网访问的地方&#xff0c;某个服务需要访问一下这个文件。这个文件基本上就是一次寿命&#xff0c;也就是你上传一下&#xff0c;然后被访问一下&#xff0c;这个文件的寿命就结束了。 对于这种需求&#xff0c;自建…...

C++学习细节回顾(汇总二)

一.初始化列表相关 1.初始化顺序受申明顺序影响 2.在必要时可以部分不采用初始化列表&#xff0c;避免受特性1影响 二.非类型模板参数 template< class T , size_t N 10 > 三.特化–特殊化处理 template< class T > bool less(T left , T right) { return left&…...

【行为型之访问者模式】游戏开发实战——Unity灵活数据操作与跨系统交互的架构秘诀

文章目录 &#x1f9f3; 访问者模式&#xff08;Visitor Pattern&#xff09;深度解析一、模式本质与核心价值二、经典UML结构三、Unity实战代码&#xff08;游戏物品系统&#xff09;1. 定义元素与访问者接口2. 实现具体元素类3. 实现具体访问者4. 对象结构管理5. 客户端使用 …...

ubuntu系统安装配置adb工具

获取adb tools 1. 下载最新版&#xff08;替换链接中的版本号&#xff09; wget https://dl.google.com/android/repository/platform-tools-latest-linux.zip2. 解压到当前目录 unzip platform-tools-latest-linux.zip3. 移动文件到系统目录 sudo mv platform-tools /usr/…...

基于Python的量化交易实盘部署与风险管理指南

基于Python的量化交易实盘部署与风险管理指南 一、模拟交易与参数优化 1.1 券商API接入与模拟交易 在量化交易落地前&#xff0c;模拟交易是策略验证的“安全沙箱”&#xff0c;其核心价值在于用零成本环境暴露策略缺陷。以股票市场为例&#xff0c;同花顺与通达信模拟盘接口…...

MySQL 入门大全:数据类型

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

WPF Datagrid 数据加载和性能

这篇文章并非讨论 WPF Datagrid 的性能数据&#xff0c;而只是简单介绍一下为了使其性能良好&#xff0c;你需要注意哪些方面。我不太想使用性能分析器来展示实际数据&#xff0c;而是尽可能地使用了 Stopwatch 类。这篇文章不会深入探讨处理海量数据的技术&#xff0c;例如分页…...

商城小程序源码介绍

今天要为大家介绍一款基于ThinkPHP、FastAdmin以及UniApp开发的商城小程序源码&#xff0c;这款源码在设计和功能上都有不俗的表现&#xff0c;非常适合想要搭建线上商城的开发者。 该源码采用了ThinkPHP作为后端框架&#xff0c;利用其强大的性能和灵活性&#xff0c;保障了系…...

【大模型】OpenManus 项目深度解析:构建通用 AI Agent的开源框架

OpenManus 项目深度解析&#xff1a;构建通用 AI Agent的开源框架 一、项目概述项目特点 二、项目运行方式与执行步骤&#xff08;一&#xff09;环境准备方法 1&#xff1a;使用 conda方法 2&#xff1a;使用 uv&#xff08;推荐&#xff09; &#xff08;二&#xff09;配置&…...

数据科学和机器学习的“看家兵器”——pandas模块 之一

目录 pandas 模块介绍 4.1 pandas 数据结构 一、课程目标 二、Series 对象介绍 三、DataFrame 对象介绍 四、Series 和 DataFrame 在具体应用中的注意事项 (一)Series 注意事项 (二)DataFrame 注意事项 五、实战案例 案例 1:学生成绩分析 案例 2:销售数据分析 案例 3:股…...

Linux服务之lvs集群与dr模式部署

目录 一.lvs相关概述 1.lvs集群的工作模式 2.lvs调度算法 3.ipvsadm工具 二.DR模式部署 一.lvs相关概述 1.lvs集群的工作模式 lvs-nat&#xff1a;修改请求报文的目标IP,多目标IP的DNAT lvs-dr&#xff1a;操纵封装新的MAC地址&#xff08;直接路由&#xff09;lvs-tu…...

LVS负载均衡群集和keepalive

目录 一. 集群概述 1.1 集群的定义 1.2 集群的分类 1. 高可用集群 HA 2. 高性能运输群集 HPC 3.负载均衡群集 LB 4. 分布式存储集群 二. LVS概述 2.1 LVS的定义 2.2 LVS的工作原理 2.3 LVS 的三种工作模式 2.4 LVS 三种工作模式的对比 2.5 LVS 调度算法 1. 静态…...

MCU裸机程序如何移植到RTOS?

目录 1、裸机编程 2、实时操作系统 3、移植裸机程序到RTOS的步骤 步骤1&#xff1a;分析裸机代码 步骤2&#xff1a;选择并设置RTOS环境 步骤3&#xff1a;设计任务架构 步骤4&#xff1a;实现任务间通信 步骤5&#xff1a;处理硬件交互 步骤6&#xff1a;测试和调试 …...