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

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/volatileconst_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.程序数据段 • 静态&#xff08;全局&#xff09;数据区&#xff1a;全局变量、静态变量 • 堆内存&#xff1a;程序员手动分配、手动释放 • 栈内存&#xff1a;编译器自动分配、自动释放 • 常量区&#xff1a;编译时大小、值确定不可修改 2.程序代码段 •…...

【多线程】七、POSIX信号量 环形队列的生产者消费者模型

文章目录 Ⅰ. 信号量一、POSIX 信号量的概念二、POSIX 信号量的类型区别三、POSIX 信号量与 SystemV 信号量的区别Ⅱ. 线程信号量基本原理一、为什么要引入信号量❓二、PV 操作三、POSIX 信号量的实现原理四、CAS操作介绍Ⅲ. POSIX未命名信号量接口一、初始化无名信号量二、销毁…...

二维码批量识别—混乱多张二维码识别-物品分拣—-未来之窗-仙盟创梦IDE

仙盟模型 用途 精准分拣&#xff1a;快速准确识别物品上复杂或多个二维码&#xff0c;依据码中信息&#xff08;如目的地、品类等&#xff09;实现物品自动化分拣&#xff0c;提高分拣效率与准确性。库存管理&#xff1a;识别入库、出库物品二维码&#xff0c;更新库存数据&am…...

《TensorFlow 与 TensorFlow Lite:协同驱动 AI 应用全景》

《TensorFlow 与 TensorFlow Lite&#xff1a;协同驱动 AI 应用全景》 摘要 &#xff1a;在机器学习技术浪潮中&#xff0c;TensorFlow 与 TensorFlow Lite 作为 Google 技术栈的核心组件&#xff0c;分别占据云端训练与端侧部署的关键位置。本文将系统梳理二者架构特性、功能…...

Spring AI 实战:第三章、Spring AI结构化输出之告别杂乱无章

引言&#xff1a;当程序员遇上剧荒 “周末看什么&#xff1f;” 这个看似简单的问题&#xff0c;往往能让我们在各大影视平台间反复横跳半小时&#xff0c;最后无奈选择重刷《老友记》。本期让我们用技术解决这个"世纪难题"&#xff1a;让大模型成为你的私人影视推荐…...

ros2 humble 控制真实机械臂(以lerobot为例)

基础版 0.确保串口访问权限 sudo chmod 666 /dev/ttyARM0 # 确保串口访问权限 1.下载 lerobot 驱动功能包 git clone https://gitee.com/kong-yue1/lerobot_devices.git 2.编写控制节点&#xff08;完整代码&#xff09; 主要功能是与 Feetech 电机总线进行通信&#…...

REINFORCE蒙特卡罗策略梯度算法详解:python从零实现

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…...

模拟SIP终端向Freeswitch注册用户

1、简介 使用go语言编写一个程序&#xff0c;模拟SIP-T58终端在Freeswitch上注册用户 2、思路 以客户端向服务端Freeswitch发起REGISTER请求&#xff0c;告知服务器当前的联系地址构造SIP REGISTER请求 创建UDP连接&#xff0c;连接到Freeswitch的5060端口发送初始的REGISTER请…...

Elasticsearch 中的索引模板:如何使用可组合模板

作者&#xff1a;来自 Elastic Kofi Bartlett 探索可组合模板以及如何创建它们。 更多阅读&#xff1a; Elasticsearch&#xff1a;可组合的 Index templates - 7.8 版本之后 想获得 Elastic 认证吗&#xff1f;查看下一期 Elasticsearch Engineer 培训的时间&#xff01; El…...

一篇文章看懂时间同步服务

Linux 系统时间与时区管理 一、时间与时钟类型 时钟类型说明管理工具系统时钟由 Linux 内核维护的软件时钟&#xff0c;基于时区配置显示时间timedatectl硬件时钟 (RTC)主板上的物理时钟&#xff0c;通常以 UTC 或本地时间存储&#xff0c;用于系统启动时初始化时间hwclock …...

Mysql常用语句汇总

Mysql语句分类 DDL: 数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库、表、字段&#xff09;DML: 数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQL: 数据查询语言&#xff0c;用来查询数据库中表的记录DCL: 数据控制语言&#xff0c;用来创建数据…...

迭代器的思想和实现细节

1. 迭代器的本质 迭代器是一种行为类似指针的对象&#xff0c;它可能是指针&#xff08;如 std::vector 的迭代器&#xff09;&#xff0c;也可能是封装了指针的类&#xff08;如 std::list 的迭代器&#xff09;。如果是指针那天然就可以用下面的运算&#xff0c;如果是类&am…...

[Vue]编程式导航

在 Vue 中&#xff0c;编程式导航是通过 JavaScript 代码&#xff08;而非 <router-link> 标签&#xff09;动态控制路由跳转的核心方式。这个方法依赖于 Vue Router 提供的 API&#xff0c;能更灵活地处理复杂场景&#xff08;如异步操作、条件跳转等&#xff09;。 一、…...

使用Node.js搭建https服务器

一、引言 https是是http的安全版本&#xff0c;在http的基础上通过传输加密和身份认证保证了传输过程中的安全性。可以认为&#xff1a;https http tls/ssl。本文讲述使用Node.js搭建https服务器的方法。 二、编译OpenSSL 按照《Openssl在Linux下编译/交叉编译》&#xff0…...

网络安全:sql注入练习靶场——sqli_labs安装保姆级教程

网络安全&#xff1a;sql注入练习靶场——sqli_labs安装保姆级教程 前言 sqli-labs靶场是一个开源的sql注入练习的综合靶场&#xff0c;包含大部分sql注入漏洞以及注入方式 网络安全学习者可以通过在sqli-labs靶场练习提升对sql注入的理解&#xff0c;以及学习各种绕过姿势。…...

rfsoc petalinux适配调试记录

1。安装虚拟机 2.设置共享文件夹 https://xinzhi.wenda.so.com/a/1668239544201149先设置文件夹路径 vmware 12 下安装 ubuntu 16.04 后&#xff0c;按往常的惯例安装 vmware-tools&#xff0c;安装时提示建议使用 open-vm-tools&#xff0c;于是放弃 vmware-tools 的安装&am…...

Windows下编译WebRTC源码

一、开发环境要求 准备一台64位的win10或win11&#xff08;我用的是win11&#xff09;电脑。最好是一台纯净的、没有安装过其它软件的Windows主机&#xff0c;避免已安装的软件和库对编译造成影响。 然后最好预留超过100G的硬盘空间。因为编译WebRTC时会产生大量的临时文件需…...

【vscode】.dart文件没有错误波浪线

解决方法&#xff1a; 新建一个文件夹&#xff0c;在vscode里打开这个文件夹 在这个文件夹里新建.dart文件后打开即可出现错误波浪线...

OpenharmonyOS+RK3568,【编译烧录】

文章目录 1. 摘要 ✨2. 代码下载 &#x1f4e9;3. 编译 &#x1f5a5;️4. 修改&适配 ✂️4.1 编译框架基本概念4.2 vendor & device 目录4.3 内核编译4.3.1 如何修改、适配自己的开发板&#xff1f; 4.4 修改外设驱动 5. 烧录&验证 &#x1f4cb;参考 1. 摘要 ✨ …...

从零开始理解 C++ 后端编程中的分布式系统

一、什么是“分布式”? 简单来说,分布式系统就是由“多个计算机(或服务器)”组成的一个大系统,它们通过网络协作完成某个任务,就像一个“团队合作”一样。 想象你开了一家餐馆,最初只有 一个厨房 和 一个服务员,所有订单都在这里处理。随着生意变好,你需要: 开分店…...

基于SpringBoot的篮球竞赛预约平台设计与实现

1.1 研究背景 科学技术日新月异的如今&#xff0c;计算机在生活各个领域都占有重要的作用&#xff0c;尤其在信息管理方面&#xff0c;在这样的大背景下&#xff0c;学习计算机知识不仅仅是为了掌握一种技能&#xff0c;更重要的是能够让它真正地使用到实践中去&#xff0c;以…...

具身系列——PPO算法实现CartPole游戏(强化学习)

完整代码参考&#xff1a; https://gitee.com/chencib/ailib/blob/master/rl/ppo_cartpole.py 执行结果&#xff1a; 部分训练得分&#xff1a; (sd) D:\Dev\traditional_nn\feiai\test\rl>python ppo_cartpole_v2_succeed.py Ep: 0 | Reward: 23.0 | Running: 2…...

小程序与快应用:中国移动互联网的渐进式革命——卓伊凡的技术演进观

小程序与快应用&#xff1a;中国移动互联网的渐进式革命——卓伊凡的技术演进观 在知乎看到很多&#xff1a;“懂王”发布的要把内行笑疯了的评论&#xff0c;卓伊凡必须怼一下&#xff0c;真印证那句话&#xff0c;无知者无畏 一、Web与小程序的技术本质差异 1.1 浏览器渲染…...

Socket 编程 UDP

Socket 编程 UDP UDP 网络编程V1 版本 - echo serverV2 版本 - DictServerV3 版本 - 简单聊天室 补充参考内容地址转换函数关于 inet_ntoa UDP 网络编程 声明&#xff1a;下面代码的验证都是用Windows作为客户端的&#xff0c;如果你有两台云服务器可以直接粘贴我在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) 辅助库函数&#xff08;luaL_*&#xff09;8. luaL_len(L, in…...

YOLOv11改进:利用RT-DETR主干网络PPHGNetV2助力轻量化目标检测

这里写自定义目录标题 YOLOv11改进&#xff1a;利用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 语言特性&#xff0c;而 PHP 8.2 的编译需要编译器支持 C17 sudo yum update -y sudo yum install centos-releas…...

工业传动核心部件深度剖析:丝杆升降机与气缸的技术特性及选型指南

在工业自动化技术飞速发展的当下&#xff0c;丝杆升降机与气缸作为关键的直线传动部件&#xff0c;广泛应用于各类机械设备中。对于工程师而言&#xff0c;深入了解它们的技术特性、优缺点及适用场景&#xff0c;是实现高效、精准设备设计的重要前提。本文将从技术原理出发&…...

flask 获取各种请求数据:GET form-data x-www-form-urlencoded JSON headers 上传文件

在 Flask 里&#xff0c;能使用多种方法获取不同类型的请求数据&#xff0c;下面详细介绍常见请求数据的获取方式。 获取查询字符串参数&#xff08;GET 请求&#xff09; 查询字符串参数一般在 URL 里&#xff0c;以 ?key1value1&key2value2 这种形式存在。可通过 requ…...

c++_2011 NOIP 普及组 (1)

P1307 [NOIP 2011 普及组] 数字反转 P1307 [NOIP 2011 普及组] 数字反转 - 洛谷 # P1307 [NOIP 2011 普及组] 数字反转 ## 题目描述 给定一个整数 $N$&#xff0c;请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式&#xff0c;即除非给定的原数为零&…...

​​信息泄露:网站敏感文件泄漏的隐形危机与防御之道​

在网络安全领域&#xff0c;​​信息泄露​​常被称为“沉默的杀手”。攻击者无需复杂漏洞&#xff0c;仅通过网站无意暴露的敏感文件&#xff08;如源码备份、配置文件、版本控制记录&#xff09;&#xff0c;即可获取数据库密码、API密钥甚至服务器权限。本文将深入剖析信息泄…...

C++笔记-多态(包含虚函数,纯虚函数和虚函数表等)

1.多态的概念 多态(polymorphism)的概念:通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运行时多态(动态多态)&#xff0c;这里我们重点讲运行时多态&#xff0c;编译时多态(静态多态)和运行时多态(动态多态)。编译时多态(静态多态)主要就是我们前面讲的函…...

2025年- H22-Lc130-206. 反转链表(链表)---java版

1.题目描述 2.思路 使用迭代法 (1)定义一个前指针 (2)然后定义两个变量 curr&#xff08;head&#xff09;&#xff0c;curr.next。 (3)curr和curr.next交换位置&#xff08;只要当前指针不为空&#xff0c;执行两两交换&#xff09; 3.代码实现 /*** Definition for singly-…...

智能家居的OneNet云平台

一、声明 该项目只需要创建一个产品&#xff0c;然后这个产品里面包含几个设备&#xff0c;而不是直接创建几个产品 注意&#xff1a;传输数据使用到了不同的power&#xff0c;还有一定要手机先联网才能使用云平台 二、OneNet云平台创建 &#xff08;1&#xff09;Temperatur…...

二、shell脚本--变量与数据类型

1. 变量的定义与使用 定义变量&#xff1a;简单直接 在 Shell 里定义变量相当容易&#xff1a; 基本格式: variable_namevalue关键点 ❗&#xff1a;赋值号 的两边绝对不能有空格&#xff01;这绝对是初学者最容易踩的坑之一 &#x1f628;&#xff0c;务必留意&#xff01…...

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 算法的浩瀚宇宙中&#xff0c;树与图就像是神秘的迷宫和茂密的森林&#xff0c;充满了未知与挑战。而动态规划则是我们探索其中的神奇罗盘&#xff0c;帮助我们找到最优路径。今天&#xff0c;就让我们一起深入这片神秘领域&#xff0c;揭开树与图上动态规划的神秘面纱&am…...

Java学习手册:Spring 生态其他组件介绍

一、微服务架构相关组件 Spring Cloud 服务注册与发现 &#xff1a; Eureka &#xff1a;由 Netflix 开源&#xff0c;包含 Eureka Server 和 Eureka Client 两部分。Eureka Server 作为服务注册表&#xff0c;接收服务实例的注册请求并管理其信息&#xff1b;Eureka Client 负…...

[android]MT6835 Android 移植brctl指令

说明 android默认brctl不支持showmacs选项&#xff0c;需要移植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:谷歌浏览器&#xff0c;推荐 Safari&#xff08;WebKit&#xff09;&#xff1a;苹果浏览器&#xff0c;iOS&#xff0c;macOS Firefox&#xff1a;火狐浏览器&#xff0c;开源插件特别多&#xff08;FireBug&#xff09; IE:Wi…...

【项目实践】boost 搜索引擎

1. 项目展示 boost搜索引擎具体讲解视频 2. 项目背景 对于boost库&#xff0c;官方是没有提供搜索功能的&#xff0c;我们这个项目就是来为它添加一个站内搜索的功能。 3. 项目环境与技术栈 • 项目环境&#xff1a; ubuntu22.04、vscode • 技术栈&#xff1a; C/C、C11、S…...

接口隔离原则(ISP)

非常好&#xff0c;**接口隔离原则&#xff08;ISP: Interface Segregation Principle&#xff09;是 SOLID 五大原则中的第四个&#xff0c;它专门解决“一个接口太臃肿”**导致的麻烦。 我来从以下几个维度详细拆解&#xff1a; &#x1f9e0; 什么是接口隔离原则&#xff1…...

Leetcode刷题记录29——矩阵置零

题源&#xff1a;https://leetcode.cn/problems/set-matrix-zeroes/description/?envTypestudy-plan-v2&envIdtop-100-liked 题目描述&#xff1a; 思路一&#xff1a; &#x1f4a1; 解题思路 本题中我们采用如下策略&#xff1a; 第一次遍历整个矩阵&#xff0c;记…...

复刻低成本机械臂 SO-ARM100 组装篇(打螺丝喽)

视频讲解&#xff1a; 复刻低成本机械臂 SO-ARM100 组装篇&#xff08;打螺丝喽&#xff09; 组装的视频有很多&#xff0c;参考大佬的《手把手复刻HuggingFace开源神作之Follower机械臂组装&#xff0c;资料已整理》_哔哩哔哩_bilibili&#xff0c;跟着视频做&#xff0c;大体…...

[更新完毕]2025东三省B题深圳杯B题数学建模挑战赛数模思路代码文章教学:LED显示屏颜色转换设计与校正

完整内容请看文章最下面的推广群 已经更新完整的文章代码 基于非线性映射与深度模型的多通道LED显示屏色彩校正 摘要 本研究聚焦于高动态色彩空间下LED显示屏的色彩映射与逐点校正问题&#xff0c;结合非线性回归理论与深度学习模型&#xff0c;构建了一套涵盖BT.2020映射、RG…...

Easy云盘总结篇-登录注册

**说在前面&#xff1a;该项目是跟着B站一位大佬写的&#xff0c;不分享源码&#xff0c;支持项目付费 ** 获取图形验证码 可以看到这里有2两种图形验证码&#xff0c;分为&#xff1a; type0&#xff1a;如上图下面那个&#xff0c;是完成操作后要进行注册的验证码 type1: 如…...

04 基于 STM32 的时钟展示程序

前言 我们经常会看到 各个场合下面有 基于数码管 的时钟程序 比如 在车站, 教室, 办公室 等等 各个场合都有 然后 这里就是做一个 简单的 时钟程序 展示程序 测试用例 每一秒钟更新时间, 然后 迭代更新 天, 时, 分 等等 然后 主流程 基于 天, 时分秒 渲染数码管 #incl…...

音视频开发技术总结报告

音视频开发技术总结报告 一、音视频开发基础 1、音频基础 声音原理 声波特性&#xff1a;频率、振幅、波长人耳听觉范围&#xff1a;20Hz-20kHz声音三要素&#xff1a;音调、音量、音色 数字音频基础 采样率&#xff1a;常见44.1kHz、48kHz、96kHz量化位数&#xff1a;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&…...