C++总结01-类型相关
一、数据存储
1.程序数据段
• 静态(全局)数据区:全局变量、静态变量
• 堆内存:程序员手动分配、手动释放
• 栈内存:编译器自动分配、自动释放
• 常量区:编译时大小、值确定不可修改
2.程序代码段
• 函数体
二、Stack 栈内存
• 栈内存属于执行期函数,编译时大小确定
• 函数执行时,栈空间自动分配
• 函数结束时,栈空间自动销毁
• 栈上对象线性分配,连续排列,没有内存碎片效应
• 栈内存具有函数本地性,不存在多线程竞争
• 栈内存有大小限制,可能会溢出,例如Linux默认为8MB,Windows默认为1MB
• 栈内存使用对象或引用直接使用,管理复杂度低
三、Heap 堆内存
• 堆内存属于具有全局共享特点,大小动态变化
• 对象分配时,手动分配堆内存(malloc/new)
• 对象释放时,手动释放堆内存(delete/free)
• 堆上对象链式分配,非连续排列
• 堆内存全局共享,存在多线程竞争可能性
• 堆内存大小没有栈内存严格限制,与机器内存总量和进程寻址空间相关
• 堆内存使用指针间接访问,管理复杂度高
• 堆内存有很高灵活性,虽性能较差,但可通过相关设施和编程技巧精细控制,从而获得改善。
四、堆-栈内存
• 栈内存分配快,布局连续,缓存友好,释放快
• 如果生存周期短,拷贝较少(传参、返回值),栈内存性能更好
• 堆内存有很高灵活性,但性能较差
• 堆内存在长运行程序有内存碎片效应,小块空闲内存得不到重用
• 堆分配需要寻找合适大小内存块,会花费更多时间
• 堆空间碎片化,容易降低缓存效率
• 编译器较难优化使用指针的代码
• 使用者需要确保申请释放成对,避免内存泄漏导致堆内存耗尽
• 使用者需要确保内存释放后不能访问(悬浮指针)
• 可以通过RAII 和指针移动操作避免拷贝代价。
五、值语义与引用语义
• 对内置类型和用户自定义类型提供同等支持。不存在特权类型或限定
5.1 值语义详解
对象以值的方式直接存储,传参、返回值、拷贝等。
1.行为特点
拷贝独立性:每次赋值或传参时,会生成一个完全独立的新对象(调用拷贝构造函数或移动构造函数)。
std::vector<int> v1 = {1, 2, 3};
std::vector<int> v2 = v1; // 值语义:v2是v1的深拷贝副本
v2.push_back(4); // 修改v2不影响v1
2.底层原理
深拷贝:值语义的对象(如std::string、std::vector)会递归复制所有成员数据到新内存。
自动生命周期:对象超出作用域时自动调用析构函数释放内存(RAII机制)。
3.优点
安全性:数据隔离,避免意外的副作用。
确定性:生命周期清晰,无需担心悬空引用,没有内存泄漏,没有数据竞争
4.缺点
性能开销:拷贝大对象(如容器)成本高(可通过移动语义优化)。
不能支持虚函数多态
5.典型场景
需要独立修改的局部变量。
函数参数传递中不希望影响原数据时(如void func(std::string s))。
5.2 引用语义详解
对象以指针或引用的方式间接存储,参数、返回值、拷贝传递的是指针或引用。
1.行为特点
别名机制:引用或指针是原数据的“标签”,操作引用即操作原数据。
int a = 10;
int& ref = a; // 引用语义:ref是a的别名
ref = 20; // 直接修改a的值
2.底层原理
内存共享:引用本质是指针的语法糖(编译器自动解引用),指针直接存储内存地址。
手动管理:裸指针需注意生命周期(易悬空),引用需确保原对象存活。
3.优点
零拷贝:传递大对象时无性能开销。
共享修改:允许多个部分代码协同操作同一数据。
4.缺点
安全性风险:悬空引用、数据竞争(需配合const或智能指针)。
复杂性:需显式管理生命周期(如使用std::shared_ptr)。
5.典型场景
避免拷贝大对象(如void process(const std::vector& data))。
需要跨作用域共享数据(如类成员、回调函数)。
六、变量的生命周期
• 全局变量,函数中的静态变量,类静态数据成员:程序启动后加载,程序结束释放。
• 局部变量、自动对象(栈):自声明开始,到声明语句所在块结尾 }释放
• 堆变量,自由存储对象:new开始,delete结束
• 临时对象: 和表达式周期一致,通常类似自动对象(绑定引用除外)
• 线程局部对象, thread_local:随线程创建而创建,随线程结束而释放。
在C++中,临时对象(Temporary Objects)是编译器在表达式求值过程中隐式创建的、生命周期短暂的匿名对象。它们通常出现在类型转换、函数返回值或运算符重载等场景中。
临时对象的常见产生场景
1.函数返回非引用类型的对象
std::string getString() { return "Hello"; // 返回时构造临时对象
}
// 临时对象用于初始化s
std::string s = getString();
2.类型转换(隐式或显式)
cpp
int a = 10;
double b = a + 3.14; // int转换为double时生成临时对象
3.运算符重载
class Complex {
public:Complex operator+(const Complex& rhs) {return Complex(this->real + rhs.real, this->imag + rhs.imag); // 返回临时对象}
};
Complex c1, c2;
Complex c3 = c1 + c2; // operator+返回的临时对象用于初始化c3
4.函数参数传递时的类型不匹配
void printString(const std::string& s) { /*...*/ }
printString("Hello"); // 从const char*隐式构造临时std::string
5.构造函数的隐式调用
class Widget { /*...*/ };
void processWidget(Widget w) { /*...*/ }
processWidget(Widget()); // 传递临时Widget对象
临时对象的生命周期规则
1.一般规则
临时对象在完整表达式结束时销毁(通常是分号处)。
std::string s = getString() + " World";
// 临时对象(getString()的返回值)在分号后销毁
2.绑定到引用时的扩展
若临时对象被绑定到const引用或右值引用,其生命周期延长至引用的作用域结束。
const std::string& ref = getString(); // 临时对象生命周期延长至ref作用域结束
std::string&& rref = getString(); // 同样延长(C++11起)
3.成员访问时的陷阱
临时对象的成员通过指针/引用访问时,需确保临时对象存活:
const std::string* p = &(getString().c_str()); // 错误:临时对象已销毁
std::string&& s = getString(); // 正确:生命周期延长
七、变量的初始化
• 统一初始化:int a1{100}; int a2={100};
• 赋值初始化:int a3=100;
• 构造初始化:int a4(100);
• 大多数情况推荐使用统一初始化,又叫列表初始化,特别是对象、容器;对于数值,可防止隐式窄化转型。空列表{}使用默认值初始化。
• 基本数值类型,以及auto自动推断类型声明,可以继续使用赋值初始化(除非需要避免数值窄化转型)。
八、指针是万恶之源:内存错误的罪与罚
• 所有权不清晰(谁分配,谁释放?)
• 对象类型不清晰(栈对象、堆对象、数组对象、资源句柄?)
• 错误百出的指针
1.内存泄漏——忘记delete之前new的内存
2.悬浮指针—— 使用已释放内存(读取、或写入)、返回栈对象地址
3.重复删除—— 对已经删除过的对象,进行二次删除
4.删除非堆对象指针——对栈对象、全局/静态对象地址进行删除
5.分配与删除错误匹配—— new和free搭配,malloc和delete搭配,new[]和delete搭配,new和delete[] 搭配
6.使用空指针
7.使用失效引用
九、基于对象编程
数据成员(字段)+函数成员
对象有什么?
实例成员与this指针
静态成员
•对象在哪里?——空间分析
•基本类型成员
•内嵌对象成员
•内嵌指针成员
•操作符重载
深入理解面向对象
向下:深入理解三大面向对象机制
• 封装,隐藏内部实现
• 继承,复用现有代码
• 多态,改写对象行为
向上:深刻把握面向对象机制所带来的抽象意义,理解如何使用这些机制来表达现实世界,掌握什么是“好的面向对象设计”
十、C++ 对象模型基础
• C++对象内存布局
按照实例数据成员声明顺序从上到下排列(与C语言保持兼容)
虚函数指针占用一个指针size
静态数据成员不参与
• 内存对齐与填充——
对象内存对齐是为了优化CPU存储数据效率、避免数据截断
按对齐系数(4字节、8字节)整倍数
可使用#pragma pack(4)控制
简单优化:长字段放前,短字段置后(聚集)
• 对象有多大?sizeof
可参考我的另一篇文章:单一继承类成员布局
十一、特殊成员函数与三法则(Rule of Three)
• 四大特殊成员函数
• 默认构造函数(无参) , 如果不定义任何拷贝构造,编译器自动生成
• 析构函数/ 拷贝构造函数 / 赋值操作符,如果不定义,编译器自动生成
• 使用 default 让编译器自动生成。
• 使用 delete 让编译器不要自动生成。
• 三法则:析构函数、拷贝构造函数、赋值操作符 三者自定义其一,则需要同时定义另外两个(编译器自动生成的一般语义错误)。
• 编译器自动生成的拷贝/赋值是按字节拷贝,如不正确,则需要自定义拷贝/赋值/析构行为:
• 赋值操作符中的 Copy & Swap 惯用法
• 注意赋值操作中避免“自我赋值”。
• 需要自定义三大函数的类,通常包含指针指向的动态数据成员。
备注:c++11之后增加移动构造和移动赋值函数
十二、清楚对象的构造/析构点
• 构造器什么时候被调用?
• 当对象(包括嵌套成员)被定义时(堆栈、堆或静态)。
• 当对象的数组被定义时(堆栈、堆或静态)。
• 当函数参数以值传递时
• 当函数返回一个对象时
• 甚至适用于编译器生成的临时对象。
• 析构器什么时候被调用?
• 当命名的堆栈对象、数组或参数超出范围时(包括嵌套对象成员)
• 当堆对象或数组被删除时
• 对于静态对象,在程序结束时
• 对于临时对象,在创建它们的 "完整表达式 "结束时调用
C++内嵌对象的构造和析构时机
在C++中,内嵌对象(作为类的成员变量)的构造和析构时机遵循特定的规则,理解这些规则对于正确管理对象生命周期非常重要。
构造顺序
构造时机:内嵌对象在包含它的类对象构造时被构造
构造顺序:
按照成员变量在类定义中声明的顺序依次构造(不是初始化列表中的顺序)
先构造所有内嵌对象,然后才执行包含类的构造函数体
class A {
public:A() { cout << "A constructed" << endl; }~A() { cout << "A destroyed" << endl; }
};class B {
public:B() { cout << "B constructed" << endl; }~B() { cout << "B destroyed" << endl; }
};class Container {A a;B b;
public:Container() : b(), a() { // 初始化列表顺序不影响实际构造顺序cout << "Container constructed" << endl;}~Container() {cout << "Container destroyed" << endl;}
};// 使用:
Container c;
/* 输出顺序:
A constructed
B constructed
Container constructed
*/
析构顺序
析构时机:内嵌对象在包含它的类对象析构时被析构
析构顺序:
先执行包含类的析构函数体
然后按照成员变量声明顺序的逆序析构内嵌对象
// 接上面的例子,当Container对象离开作用域时:
/* 输出顺序:
Container destroyed
B destroyed
A destroyed
*/
十三、常用类型——数组最佳实践
• 尽量避免使用C风格数组,有很多安全隐患
• 本质是指针指向的一块连续内存,引用语义
• 不带长度信息,易错点:拷贝、传参、返回值
• 不要使用指针传递数组,传递指针仅代表单个对象
• 不要使用C风格数组承载多态对象(基类、子类)
• 使用抽象管理内存
• 使用vector<T>
实现变长数组,替代堆上的C风格数组
• 使用array<T>
实现定长数组,替代栈上的C风格数组
在C++中,使用C风格数组(如Base array[10])来存储多态对象会导致严重的对象切片问题,应该避免这种做法
请看我的另一篇文章不要以多态的方式处理数组
十四、常用类型——字符串最佳实践
• 尽量避免使用C风格字符串(“”默认字面常量)
• 零结尾的字符数组,与字符数组有区别
• 拥有一切C风格数组的安全隐患
• 使用string替代C风格字符串(“”字面常量以s结尾)
• 能够正确分配资源,处理所有权、拷贝、扩容等操作
• 但谨慎处理C风格字符串API和string的交互
• string内部实现了短字符串优化技术,拥有极高性能
• 短字符串(<14字符)默认存在栈中,长字符串将分配于堆上。
• string_view 字符串的只读视图,表示为(指针,长度)
• 不拥有,,不拷贝字符串,是字符串只读操作的性能之选
十五、其他类型——枚举类
• enum class 是一种限制了作用域的强类型枚举
• 强类型,不能和整数类型进行隐式转换。
• 可以显式指定枚举类的基础类型(存储类型),默认int
• 可以使用整数常量初始化枚举值
• 和整数之间转型要使用显式转型(static_cast)
• 普通enum类型继承自C语言
• 弱类型,和基础类型存在隐式转换
• 作用域位于enum本身所在作用域(名字空间污染)
• 建议使用enum class替换不安全的enum
十六、戒除C语言的“不良习惯”
• 辨析使用场景和对象所有权,谨慎使用裸指针
• 使用C++类型转换替换C风格的强制转换
• 使用模板和编译时计算等替换C风格的宏机制
• 尽量避免全局数据,谨慎使用全局函数
• 严格避免 malloc() 和 free()
场景需求 | 推荐转换方式 |
---|---|
基本类型安全转换 | static_cast |
多态类型向下转型 | dynamic_cast |
移除 const/volatile | const_cast |
低级二进制重解释 | reinterpret_cast |
十七、性能指南——类型与成员(1)
• 如果函数非常小,并时间敏感,将其声明为 inline
• 如果函数可能在编译期进行求值,就将其声明为 constexpr
• 类定义中禁止不期望的复制
• 使用成员初始化式来对类内数据成员进行默认值初始化
• 如果定义或者 =delete 了任何复制、移动或析构函数,请定义或者 =delete 它们全部(五法则)
• 将单参数的构造函数声明为 explicit,复制和移动构造函数则不• 采用 union 用以节省内存
十八、性能指南——类型与成员(2)
• 通过常量引用传递只读参数,而不是通过值。
• 尽可能地推迟对象的定义:晚加载,早释放
• 优先在构造函数中进行初始化而不是赋值。
• 考虑重载以避免隐式类型转换。
• 理解返回值优化(RVO)
返回值优化(Return Value Optimization,RVO)是 C++ 编译器的一项重要优化技术,用于消除函数返回对象时的临时对象构造和复制/移动操作。
RVO 的类型
1.命名返回值优化(NRVO, Named Return Value Optimization):
• 优化命名局部变量的返回
• 不是强制性的,但大多数现代编译器都支持
2.纯 RVO:
• 优化临时对象的返回
触发 RVO 的条件
1.返回的类型与函数返回类型完全一致
2.返回的是一个局部对象(对于 NRVO)或临时对象(对于纯 RVO)
3.所有返回路径返回同一个对象(对于 NRVO)
示例:
#include <iostream>class Test {
public:Test() { std::cout << "Constructor\n"; }Test(const Test&) { std::cout << "Copy Constructor\n"; }Test(Test&&) { std::cout << "Move Constructor\n"; }~Test() { std::cout << "Destructor\n"; }
};// 可能应用 NRVO
Test createTest() {Test t;return t; // 可能被优化,不调用拷贝/移动构造函数
}// 纯 RVO
Test createTest2() {return Test(); // 从 C++17 开始,保证不调用移动/拷贝构造函数
}int main() {std::cout << "Creating test1:\n";Test test1 = createTest(); // 通常只有一次构造std::cout << "\nCreating test2:\n";Test test2 = createTest2(); // 保证只有一次构造return 0;
}
相关文章:
C++总结01-类型相关
一、数据存储 1.程序数据段 • 静态(全局)数据区:全局变量、静态变量 • 堆内存:程序员手动分配、手动释放 • 栈内存:编译器自动分配、自动释放 • 常量区:编译时大小、值确定不可修改 2.程序代码段 •…...
【多线程】七、POSIX信号量 环形队列的生产者消费者模型
文章目录 Ⅰ. 信号量一、POSIX 信号量的概念二、POSIX 信号量的类型区别三、POSIX 信号量与 SystemV 信号量的区别Ⅱ. 线程信号量基本原理一、为什么要引入信号量❓二、PV 操作三、POSIX 信号量的实现原理四、CAS操作介绍Ⅲ. POSIX未命名信号量接口一、初始化无名信号量二、销毁…...
二维码批量识别—混乱多张二维码识别-物品分拣—-未来之窗-仙盟创梦IDE
仙盟模型 用途 精准分拣:快速准确识别物品上复杂或多个二维码,依据码中信息(如目的地、品类等)实现物品自动化分拣,提高分拣效率与准确性。库存管理:识别入库、出库物品二维码,更新库存数据&am…...
《TensorFlow 与 TensorFlow Lite:协同驱动 AI 应用全景》
《TensorFlow 与 TensorFlow Lite:协同驱动 AI 应用全景》 摘要 :在机器学习技术浪潮中,TensorFlow 与 TensorFlow Lite 作为 Google 技术栈的核心组件,分别占据云端训练与端侧部署的关键位置。本文将系统梳理二者架构特性、功能…...
Spring AI 实战:第三章、Spring AI结构化输出之告别杂乱无章
引言:当程序员遇上剧荒 “周末看什么?” 这个看似简单的问题,往往能让我们在各大影视平台间反复横跳半小时,最后无奈选择重刷《老友记》。本期让我们用技术解决这个"世纪难题":让大模型成为你的私人影视推荐…...
ros2 humble 控制真实机械臂(以lerobot为例)
基础版 0.确保串口访问权限 sudo chmod 666 /dev/ttyARM0 # 确保串口访问权限 1.下载 lerobot 驱动功能包 git clone https://gitee.com/kong-yue1/lerobot_devices.git 2.编写控制节点(完整代码) 主要功能是与 Feetech 电机总线进行通信&#…...
REINFORCE蒙特卡罗策略梯度算法详解:python从零实现
🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…...
模拟SIP终端向Freeswitch注册用户
1、简介 使用go语言编写一个程序,模拟SIP-T58终端在Freeswitch上注册用户 2、思路 以客户端向服务端Freeswitch发起REGISTER请求,告知服务器当前的联系地址构造SIP REGISTER请求 创建UDP连接,连接到Freeswitch的5060端口发送初始的REGISTER请…...
Elasticsearch 中的索引模板:如何使用可组合模板
作者:来自 Elastic Kofi Bartlett 探索可组合模板以及如何创建它们。 更多阅读: Elasticsearch:可组合的 Index templates - 7.8 版本之后 想获得 Elastic 认证吗?查看下一期 Elasticsearch Engineer 培训的时间! El…...
一篇文章看懂时间同步服务
Linux 系统时间与时区管理 一、时间与时钟类型 时钟类型说明管理工具系统时钟由 Linux 内核维护的软件时钟,基于时区配置显示时间timedatectl硬件时钟 (RTC)主板上的物理时钟,通常以 UTC 或本地时间存储,用于系统启动时初始化时间hwclock …...
Mysql常用语句汇总
Mysql语句分类 DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)DML: 数据操作语言,用来对数据库表中的数据进行增删改DQL: 数据查询语言,用来查询数据库中表的记录DCL: 数据控制语言,用来创建数据…...
迭代器的思想和实现细节
1. 迭代器的本质 迭代器是一种行为类似指针的对象,它可能是指针(如 std::vector 的迭代器),也可能是封装了指针的类(如 std::list 的迭代器)。如果是指针那天然就可以用下面的运算,如果是类&am…...
[Vue]编程式导航
在 Vue 中,编程式导航是通过 JavaScript 代码(而非 <router-link> 标签)动态控制路由跳转的核心方式。这个方法依赖于 Vue Router 提供的 API,能更灵活地处理复杂场景(如异步操作、条件跳转等)。 一、…...
使用Node.js搭建https服务器
一、引言 https是是http的安全版本,在http的基础上通过传输加密和身份认证保证了传输过程中的安全性。可以认为:https http tls/ssl。本文讲述使用Node.js搭建https服务器的方法。 二、编译OpenSSL 按照《Openssl在Linux下编译/交叉编译》࿰…...
网络安全:sql注入练习靶场——sqli_labs安装保姆级教程
网络安全:sql注入练习靶场——sqli_labs安装保姆级教程 前言 sqli-labs靶场是一个开源的sql注入练习的综合靶场,包含大部分sql注入漏洞以及注入方式 网络安全学习者可以通过在sqli-labs靶场练习提升对sql注入的理解,以及学习各种绕过姿势。…...
rfsoc petalinux适配调试记录
1。安装虚拟机 2.设置共享文件夹 https://xinzhi.wenda.so.com/a/1668239544201149先设置文件夹路径 vmware 12 下安装 ubuntu 16.04 后,按往常的惯例安装 vmware-tools,安装时提示建议使用 open-vm-tools,于是放弃 vmware-tools 的安装&am…...
Windows下编译WebRTC源码
一、开发环境要求 准备一台64位的win10或win11(我用的是win11)电脑。最好是一台纯净的、没有安装过其它软件的Windows主机,避免已安装的软件和库对编译造成影响。 然后最好预留超过100G的硬盘空间。因为编译WebRTC时会产生大量的临时文件需…...
【vscode】.dart文件没有错误波浪线
解决方法: 新建一个文件夹,在vscode里打开这个文件夹 在这个文件夹里新建.dart文件后打开即可出现错误波浪线...
OpenharmonyOS+RK3568,【编译烧录】
文章目录 1. 摘要 ✨2. 代码下载 📩3. 编译 🖥️4. 修改&适配 ✂️4.1 编译框架基本概念4.2 vendor & device 目录4.3 内核编译4.3.1 如何修改、适配自己的开发板? 4.4 修改外设驱动 5. 烧录&验证 📋参考 1. 摘要 ✨ …...
从零开始理解 C++ 后端编程中的分布式系统
一、什么是“分布式”? 简单来说,分布式系统就是由“多个计算机(或服务器)”组成的一个大系统,它们通过网络协作完成某个任务,就像一个“团队合作”一样。 想象你开了一家餐馆,最初只有 一个厨房 和 一个服务员,所有订单都在这里处理。随着生意变好,你需要: 开分店…...
基于SpringBoot的篮球竞赛预约平台设计与实现
1.1 研究背景 科学技术日新月异的如今,计算机在生活各个领域都占有重要的作用,尤其在信息管理方面,在这样的大背景下,学习计算机知识不仅仅是为了掌握一种技能,更重要的是能够让它真正地使用到实践中去,以…...
具身系列——PPO算法实现CartPole游戏(强化学习)
完整代码参考: https://gitee.com/chencib/ailib/blob/master/rl/ppo_cartpole.py 执行结果: 部分训练得分: (sd) D:\Dev\traditional_nn\feiai\test\rl>python ppo_cartpole_v2_succeed.py Ep: 0 | Reward: 23.0 | Running: 2…...
小程序与快应用:中国移动互联网的渐进式革命——卓伊凡的技术演进观
小程序与快应用:中国移动互联网的渐进式革命——卓伊凡的技术演进观 在知乎看到很多:“懂王”发布的要把内行笑疯了的评论,卓伊凡必须怼一下,真印证那句话,无知者无畏 一、Web与小程序的技术本质差异 1.1 浏览器渲染…...
Socket 编程 UDP
Socket 编程 UDP UDP 网络编程V1 版本 - echo serverV2 版本 - DictServerV3 版本 - 简单聊天室 补充参考内容地址转换函数关于 inet_ntoa UDP 网络编程 声明:下面代码的验证都是用Windows作为客户端的,如果你有两台云服务器可以直接粘贴我在Linux下的客…...
Lua 基础 API与 辅助库函数 中关于创建的方法用法
目录 基础 API 函数1. lua_len(L, index)2. lua_load(L, reader, data, chunkname, mode)3. lua_newstate(allocator, ud)4. lua_newtable(L)5. lua_newthread(L)6. lua_newuserdata(L, size)7. lua_next(L, index) 辅助库函数(luaL_*)8. luaL_len(L, in…...
YOLOv11改进:利用RT-DETR主干网络PPHGNetV2助力轻量化目标检测
这里写自定义目录标题 YOLOv11改进:利用RT-DETR主干网络PPHGNetV2助力轻量化目标检测1. 介绍2. 引言3. 技术背景3.1 YOLOv11概述3.2 RT-DETR与PPHGNetV23.3 相关工作 4. 应用使用场景5. 详细代码实现5.1 环境准备5.2 PPHGNetV2主干网络实现5.3 YOLOv11与PPHGNetV2集…...
centos7.0无法安装php8.2/8.3
在centos安装php8.2报错 configure: error: *** A compiler with support for C17 language features is required. 配置过程检测到你的系统编译器不支持 C17 语言特性,而 PHP 8.2 的编译需要编译器支持 C17 sudo yum update -y sudo yum install centos-releas…...
工业传动核心部件深度剖析:丝杆升降机与气缸的技术特性及选型指南
在工业自动化技术飞速发展的当下,丝杆升降机与气缸作为关键的直线传动部件,广泛应用于各类机械设备中。对于工程师而言,深入了解它们的技术特性、优缺点及适用场景,是实现高效、精准设备设计的重要前提。本文将从技术原理出发&…...
flask 获取各种请求数据:GET form-data x-www-form-urlencoded JSON headers 上传文件
在 Flask 里,能使用多种方法获取不同类型的请求数据,下面详细介绍常见请求数据的获取方式。 获取查询字符串参数(GET 请求) 查询字符串参数一般在 URL 里,以 ?key1value1&key2value2 这种形式存在。可通过 requ…...
c++_2011 NOIP 普及组 (1)
P1307 [NOIP 2011 普及组] 数字反转 P1307 [NOIP 2011 普及组] 数字反转 - 洛谷 # P1307 [NOIP 2011 普及组] 数字反转 ## 题目描述 给定一个整数 $N$,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零&…...
信息泄露:网站敏感文件泄漏的隐形危机与防御之道
在网络安全领域,信息泄露常被称为“沉默的杀手”。攻击者无需复杂漏洞,仅通过网站无意暴露的敏感文件(如源码备份、配置文件、版本控制记录),即可获取数据库密码、API密钥甚至服务器权限。本文将深入剖析信息泄…...
C++笔记-多态(包含虚函数,纯虚函数和虚函数表等)
1.多态的概念 多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运行时多态(动态多态),这里我们重点讲运行时多态,编译时多态(静态多态)和运行时多态(动态多态)。编译时多态(静态多态)主要就是我们前面讲的函…...
2025年- H22-Lc130-206. 反转链表(链表)---java版
1.题目描述 2.思路 使用迭代法 (1)定义一个前指针 (2)然后定义两个变量 curr(head),curr.next。 (3)curr和curr.next交换位置(只要当前指针不为空,执行两两交换) 3.代码实现 /*** Definition for singly-…...
智能家居的OneNet云平台
一、声明 该项目只需要创建一个产品,然后这个产品里面包含几个设备,而不是直接创建几个产品 注意:传输数据使用到了不同的power,还有一定要手机先联网才能使用云平台 二、OneNet云平台创建 (1)Temperatur…...
二、shell脚本--变量与数据类型
1. 变量的定义与使用 定义变量:简单直接 在 Shell 里定义变量相当容易: 基本格式: variable_namevalue关键点 ❗:赋值号 的两边绝对不能有空格!这绝对是初学者最容易踩的坑之一 😨,务必留意!…...
GitHub Actions 和 GitLab CI/CD 流水线设计
以下是关于 GitHub Actions 和 GitLab CI/CD 流水线设计 的基本知识总结: 一、核心概念对比 维度GitHub ActionsGitLab CI/CD配置方式YAML 文件(.github/workflows/*.yml).gitlab-ci.yml执行环境GitHub 托管 Runner / 自托管GitLab 共享 Runner / 自托管市场生态Actions Mar…...
穿越数据森林与网络迷宫:树与图上动态规划实战指南
在 C 算法的浩瀚宇宙中,树与图就像是神秘的迷宫和茂密的森林,充满了未知与挑战。而动态规划则是我们探索其中的神奇罗盘,帮助我们找到最优路径。今天,就让我们一起深入这片神秘领域,揭开树与图上动态规划的神秘面纱&am…...
Java学习手册:Spring 生态其他组件介绍
一、微服务架构相关组件 Spring Cloud 服务注册与发现 : Eureka :由 Netflix 开源,包含 Eureka Server 和 Eureka Client 两部分。Eureka Server 作为服务注册表,接收服务实例的注册请求并管理其信息;Eureka Client 负…...
[android]MT6835 Android 移植brctl指令
说明 android默认brctl不支持showmacs选项,需要移植brctl-utils软件包 移除toybox中brctl编译 mssi/external/toybox/Android.bp 将 toybox_symlinks ["[","acpi","base64","basename","blockdev","br…...
安卓基础(悬浮窗分级菜单和弹窗)
initializeViews() 初始化 把全部的按钮都弄出来 // 主菜单按钮ImageButton mainButton floatingMenuView.findViewById(R.id.main_button);// 二级菜单按钮subButtons new ImageButton[3];subButtons[0] floatingMenuView.findViewById(R.id.sub_button_1);subButtons[1]…...
HTTP基础介绍+OSI七层参考模型+HTTP协议介绍
图片来源于网络 图片来源于网络 浏览器 Chrome:谷歌浏览器,推荐 Safari(WebKit):苹果浏览器,iOS,macOS Firefox:火狐浏览器,开源插件特别多(FireBug) IE:Wi…...
【项目实践】boost 搜索引擎
1. 项目展示 boost搜索引擎具体讲解视频 2. 项目背景 对于boost库,官方是没有提供搜索功能的,我们这个项目就是来为它添加一个站内搜索的功能。 3. 项目环境与技术栈 • 项目环境: ubuntu22.04、vscode • 技术栈: C/C、C11、S…...
接口隔离原则(ISP)
非常好,**接口隔离原则(ISP: Interface Segregation Principle)是 SOLID 五大原则中的第四个,它专门解决“一个接口太臃肿”**导致的麻烦。 我来从以下几个维度详细拆解: 🧠 什么是接口隔离原则࿱…...
Leetcode刷题记录29——矩阵置零
题源:https://leetcode.cn/problems/set-matrix-zeroes/description/?envTypestudy-plan-v2&envIdtop-100-liked 题目描述: 思路一: 💡 解题思路 本题中我们采用如下策略: 第一次遍历整个矩阵,记…...
复刻低成本机械臂 SO-ARM100 组装篇(打螺丝喽)
视频讲解: 复刻低成本机械臂 SO-ARM100 组装篇(打螺丝喽) 组装的视频有很多,参考大佬的《手把手复刻HuggingFace开源神作之Follower机械臂组装,资料已整理》_哔哩哔哩_bilibili,跟着视频做,大体…...
[更新完毕]2025东三省B题深圳杯B题数学建模挑战赛数模思路代码文章教学:LED显示屏颜色转换设计与校正
完整内容请看文章最下面的推广群 已经更新完整的文章代码 基于非线性映射与深度模型的多通道LED显示屏色彩校正 摘要 本研究聚焦于高动态色彩空间下LED显示屏的色彩映射与逐点校正问题,结合非线性回归理论与深度学习模型,构建了一套涵盖BT.2020映射、RG…...
Easy云盘总结篇-登录注册
**说在前面:该项目是跟着B站一位大佬写的,不分享源码,支持项目付费 ** 获取图形验证码 可以看到这里有2两种图形验证码,分为: type0:如上图下面那个,是完成操作后要进行注册的验证码 type1: 如…...
04 基于 STM32 的时钟展示程序
前言 我们经常会看到 各个场合下面有 基于数码管 的时钟程序 比如 在车站, 教室, 办公室 等等 各个场合都有 然后 这里就是做一个 简单的 时钟程序 展示程序 测试用例 每一秒钟更新时间, 然后 迭代更新 天, 时, 分 等等 然后 主流程 基于 天, 时分秒 渲染数码管 #incl…...
音视频开发技术总结报告
音视频开发技术总结报告 一、音视频开发基础 1、音频基础 声音原理 声波特性:频率、振幅、波长人耳听觉范围:20Hz-20kHz声音三要素:音调、音量、音色 数字音频基础 采样率:常见44.1kHz、48kHz、96kHz量化位数:8bit、…...
FastAPI系列13:API的安全防护
API的安全防护 1、HTTPS 强制什么是HTTPS强制如何在FastAPI中实现HTTPS强制 2、CORS跨域资源共享什么是CORS在 FastAPI 中开启 CORS 3、SQL注入防护什么是SQL注入如何在FastAPI中实现SQL注入防护 4、CSRF防护什么是CSRF防护如何在FastAPI中实现CSRF防护 在 FastAPI系列12&…...