侯捷 C++ 课程学习笔记:C++ 中引用与指针的深度剖析
目录
一、引言
二、引用与指针的基本概念
(一)引用
(二)指针
三、引用与指针的区别
(一)定义与初始化
(二)内存空间与 NULL 值
(三)自增操作
(四)多级情况
(五)访问实体方式
(六)安全性
(七)sizeof 操作
四、引用与指针在函数中的应用
(一)作为函数参数
(二)作为函数返回值
五、 auto 关键字的应用
(一)类型自动推导
(二)简化迭代器声明
(三)在范围 for 循环中的应用
1. 遍历数组:
2. 遍历容器:
六、代码示例分析
(一)类型转换与引用
(二)函数性能测试
(三)返回值问题
七、总结
一、引言
在 C++ 编程中,引用和指针是两个极为重要且容易混淆的概念。它们在很多场景下都能实现相似的功能,但在底层原理、使用方式和特性上又存在诸多不同。深入理解它们的区别,对于写出高效、安全且正确的 C++ 代码至关重要。本文将结合代码示例,从多个维度对引用和指针进行剖析。同时,也会引入 auto 关键字相关内容,进一步丰富对 C++ 语言特性的理解。
二、引用与指针的基本概念
(一)引用
引用在概念上是为一个已存在的变量取的别名,它和被引用的变量共用同一块内存空间。例如:
cppint a = 10;
int& ra = a;
这里 ra 就是 a 的引用,对 ra 的操作等同于对 a 的操作 。从语法层面看,引用不开辟新的空间,只是给 a 起了个别名。但在底层实现上,引用其实是按照指针的方式来实现的,这一点从汇编指令可以看出:
asm// 假设 int a = 10; int& ra = a;
// 以下是相关汇编指令
lea eax,[a]
mov dword ptr [ra],eax
(二)指针
指针用于存储变量的地址,通过该地址可以间接访问所指向的变量。例如:
cppint a = 10;
int* pa = &a;
这里 pa 存储了 a 的地址,要访问 a 的值,需要通过解引用操作 *pa 。从语法层面看,指针会开辟空间来存储地址。
三、引用与指针的区别
(一)定义与初始化
- 引用:定义时必须初始化,因为它是变量的别名,初始化后就不能再引用其他实体。例如 int& ra; 这样的定义是错误的,必须写成 int a = 10; int& ra = a; 。
- 指针:定义时不要求必须初始化,可以先定义 int* pa; ,后续再让它指向合适的变量,如 pa = &a; ,并且指针可以在不同时刻指向不同的同类型实体 。
(二)内存空间与 NULL 值
- 引用:没有独立的内存空间(语法层面),和被引用变量共用空间,并且不存在 NULL 引用 。
- 指针:有自己独立的内存空间用于存储地址,存在 NULL 指针,如 int* p = NULL; ,表示指针不指向任何有效的内存地址。
(三)自增操作
- 引用:自增操作等同于对被引用的实体进行自增。例如 int a = 1; int& ra = a; ra++; ,执行后 a 的值变为 2 。
- 指针:自增操作是让指针向后偏移一个其所指向类型大小的字节数。比如 int* p = &a; p++; ,假设 a 地址为 0x1000 , int 类型占 4 个字节,那么 p 自增后地址变为 0x1004 。
(四)多级情况
- 引用:不存在多级引用的概念,只有一级引用。
- 指针:有多级指针,例如 int** pp; ,表示指向指针的指针。
(五)访问实体方式
- 引用:编译器自动处理对引用实体的访问,直接使用引用变量名就相当于访问被引用的实体,如 int& ra = a; ra = 5; ,就直接修改了 a 的值。
- 指针:需要显式使用解引用操作符 * 来访问所指向的实体,如 int* pa = &a; *pa = 5; 。
(六)安全性
- 引用:由于不能为 NULL 且一旦初始化就固定指向一个实体,所以使用起来相对更安全,减少了一些因空指针等问题导致的错误。
- 指针:如果使用不当,比如访问了 NULL 指针或者野指针,容易导致程序崩溃等严重问题。
(七)sizeof 操作
- 引用: sizeof 一个引用,得到的是被引用类型的大小。例如 int& ra = a; sizeof(ra) 结果为 4 (假设 int 占 4 字节)。
- 指针: sizeof 一个指针,得到的是指针所在地址空间占用的字节数,在 32 位平台下通常为 4 字节,64 位平台下通常为 8 字节。
四、引用与指针在函数中的应用
(一)作为函数参数
- 引用作为参数:
可以避免对实参的拷贝,提高效率,尤其是对于大对象。例如:
cppstruct A { int a[10000]; };
void TestFunc2(A& a){}
这里使用引用传递 A 类型对象,不会产生对象的拷贝。而且通过引用参数可以在函数内部修改实参的值,常用于实现交换函数等,如:
cppvoid Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}
- 指针作为参数:
也能实现避免拷贝和修改实参的功能。例如:
cppvoid TestFunc(A* a){}
void Swap(int* left, int* right)
{int temp = *left;*left = *right;*right = temp;
}
不过使用指针作为参数时,需要注意指针是否为 NULL ,要进行必要的判空检查,否则容易引发程序错误。
(二)作为函数返回值
- 引用作为返回值:
如果返回的是局部变量的引用,会导致未定义行为,因为局部变量在函数结束后生命周期结束。但如果返回的是静态变量或者成员变量的引用,则是合法的。例如:
cppint& Count()
{static int n = 0;n++;return n;
}
引用返回的优势在于避免了返回值的拷贝,提高性能。特别是对于大对象的返回,性能提升明显。比如:
cppstruct A { int a[10000]; };
A& TestFunc2() { return a;}
- 指针作为返回值:
同样不能返回指向局部变量的指针,因为局部变量生命周期结束后指针会变成野指针。指针返回常用于动态内存分配的场景,比如函数返回一个新分配内存的指针:
cppint* AllocateMemory()
{return new int(10);
}
使用指针返回值时,调用者需要注意内存的释放,防止内存泄漏。
五、 auto 关键字的应用
(一)类型自动推导
auto 关键字可以根据右边表达式自动推导变量的类型,使代码更加简洁。例如:
cppint a = 0;
int b = a;
auto c = a; // 根据右边的表达式自动推导c的类型
auto d = 1 + 1.11; // 根据右边的表达式自动推导d的类型
std::cout << typeid(c).name() << std::endl;
std::cout << typeid(d).name() << std::endl;
在上述代码中, c 的类型会被推导为 int , d 的类型会被推导为 double ,因为 1 + 1.11 的运算结果是 double 类型。
(二)简化迭代器声明
当处理容器类型时,使用 auto 可以简化迭代器的声明,尤其是对于类型很长的迭代器声明。比如:
cppstd::vector<int> v;
// 类型很长
// std::vector<int>::iterator it = v.begin();
// 等价于
auto it = v.begin();std::map<std::string, std::string> dict;
// std::map<std::string, std::string>::iterator dit = dict.begin();
// 等价于
auto dit = dict.begin();
这样可以让代码更简洁易读,减少出错的可能性。
(三)在范围 for 循环中的应用
范围 for 循环是 C++ 提供的一种语法糖,结合 auto 可以方便地遍历数组或容器。
1. 遍历数组:
cppint arr[] = { 1, 2, 3, 4, 5 };
// 传统方式通过下标遍历并修改数组元素
for (int i = 0; i < sizeof(arr) / sizeof(int); ++i)arr[i] *= 2;// 使用指针遍历并输出数组元素
for (int* p = arr; p < arr + sizeof(arr) / sizeof(arr[0]); ++p)std::cout << *p << " ";
std::cout << std::endl;// 使用范围for循环结合auto遍历并输出数组元素
for (auto e : arr)
{std::cout << e << " ";
}
std::cout << std::endl;// 使用范围for循环结合auto&修改数组元素
for (auto& e : arr)
{e *= 2;
}
在上述代码中, for (auto e : arr) 会依次将数组 arr 中的元素赋值给 e 进行遍历,而 for (auto& e : arr) 中 e 是引用,通过它可以修改数组中的元素。
2. 遍历容器:
对于容器(如 vector 、 map 等),同样可以使用范围 for 循环结合 auto 进行遍历。例如:
cppstd::vector<int> vec = { 10, 20, 30 };
for (auto num : vec)
{std::cout << num << " ";
}
std::cout << std::endl;std::map<std::string, int> m = { {"one", 1}, {"two", 2} };
for (const auto& pair : m)
{std::cout << pair.first << ": " << pair.second << " ";
}
std::cout << std::endl;在遍历 map 时,使用 const auto& 可以避免不必要的拷贝,并且防止在遍历过程中意外修改 map 中的键值对。
六、代码示例分析
(一)类型转换与引用
cppdouble dd = 1.11;
int ii = dd; // 隐式类型转换,截断小数部分
const int& rii = dd;
这里 int ii = dd 是普通的类型转换,将 double 类型的 dd 转换为 int 类型。而 const int& rii = dd ,编译器会创建一个临时的 int 变量,将 dd 的值转换后存入临时变量,然后 rii 引用这个临时变量。
(二)函数性能测试
在这个示例中, TestFunc1 以值传递方式接收参数,每次调用函数都会对 A 类型的对象进行拷贝,开销较大;而 TestFunc2 以引用传递方式接收参数,避免了拷贝,运行效率更高。通过计时测试可以明显看出两者在性能上的差异。
(三)返回值问题
cppint& Add(int a, int b)
{int c = a + b;return c;
}
int main()
{int& ret = Add(1, 2);Add(3, 4);cout << "Add(1, 2) is :"<< ret <<endl;return 0;
}
此代码中 Add 函数返回局部变量 c 的引用,这是错误的。因为 c 在函数结束后生命周期结束, ret 引用的是一块已经无效的内存,后续的输出结果是未定义的,可能会导致程序崩溃等问题。
七、总结
引用和指针在 C++ 中各有特点和用途。引用语法简洁、使用安全,常用于避免拷贝和作为函数参数、返回值来提高性能;指针功能强大、灵活,适用于动态内存管理等场景,但使用时需要更加谨慎,注意空指针、野指针等问题。而 auto 关键字则为 C++ 代码带来了类型推导的便利,简化了代码书写,特别是在处理复杂类型和容器遍历方面。在实际编程中,根据具体的需求和场景,合理选择使用引用、指针和 auto ,能够编写出更高效、健壮且简洁的 C++ 程序。
相关文章:
侯捷 C++ 课程学习笔记:C++ 中引用与指针的深度剖析
目录 一、引言 二、引用与指针的基本概念 (一)引用 (二)指针 三、引用与指针的区别 (一)定义与初始化 (二)内存空间与 NULL 值 (三)自增操作 …...
llamafactory微调效果与vllm部署效果不一致如何解决
在llamafactory框架训练好模型之后,自测chat时模型效果不错,但是部署到vllm模型上效果却很差 这实际上是因为llamafactory微调时与vllm部署时的对话模板不一致导致的。 对应的llamafactory的代码为 而vllm启动时会采用大模型自己本身设置的对话模板信息…...
欢乐力扣:合并两个有序链表
文章目录 1、题目描述2、思路 1、题目描述 合并两个有序链表。 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 在这里插入图片描述 2、思路 参考官方题解,简单来说就是不断调整链表指针的指向,让…...
访问者模式_行为型_GOF23
访问者模式 访问者模式(Visitor Pattern)是一种行为型设计模式,核心思想是将算法与对象结构分离,使得在不修改现有对象结构的前提下,可以动态添加新的操作。这类似于“医生查房”——医生(访问者ÿ…...
排序算法2-选择排序
目录 1.常见排序算法 2.排序算法的预定函数 2.1交换函数 2.2测试算法运行时间的函数 2.3已经实现过的排序算法 3.选择排序算法的实现 3.1直接选择排序 3.2堆排序 4.下讲预告 1.常见排序算法 前面一讲已经讲解了插入排序,这一讲我将讲解选择排序,…...
openwrt24.10.0版本上安装istoreOS的屏幕监控插件
lcdsimple 插件支持在软路由下面显示统计信息到 HDMI 或者 VGA 上。 手动安装方法: 保证 quickstart 版本大于 0.9.7 安装 lcdsimple 具体方法: opkg update is-opkg install quickstart opkg install lcdsimple 手动下载 QUICKSTART 跟 LCD SIMPL…...
内网服务器无法通过公网地址访问映射到公网的内网服务
内网服务器无法通过公网地址访问映射到公网的内网服务 问题现象问题原因解决方法总结 前几天遇到一个网络问题,在这里做下记录,希望能帮助到有相同问题的朋友。 问题现象 网络拓扑如上所示,服务器1和服务器2在同一内网,网段均为1…...
基于Web的交互式智能成绩管理系统设计
目录 摘要 绪论 一、应用背景 二、行业发展现状 三、程序开发的重要意义 四、结语 1 代码 2 数据初始化模块 3 界面布局模块 4 核心功能模块 5 可视化子系统 6 扩展功能模块 7 架构设计亮点 功能总结 一、核心数据管理 二、智能分析体系 三、可视化系统 四、扩…...
从虚拟现实到可持续设计:唐婉歆的多维创新之旅
随着线上线下融合逐渐成为全球家居与建材行业的发展趋势,全球市场对高品质、个性化家居和建材产品的需求稳步攀升,也对设计师提出更高的要求。在这一背景下,设计师唐婉歆将以产品设计师的身份,正式加入跨国企业AmCan 美加集团,投身于备受行业瞩目的系列设计项目。她将负责Showr…...
PHP MySQL 预处理语句
PHP MySQL 预处理语句 引言 在PHP中与MySQL数据库进行交互时,预处理语句是一种非常安全和高效的方法。预处理语句不仅可以防止SQL注入攻击,还可以提高数据库查询的效率。本文将详细介绍PHP中预处理语句的用法,包括其基本概念、语法、优势以及在实际开发中的应用。 预处理…...
基于飞腾/龙芯+盛科CTC7132全国产交换机解决方案
产品介绍 盛科CTC7132,内置ARM-Cortex A53 主频1.2GHz;支持24个千兆电口,24个万兆光口(850nm多模),1个千兆管理网口,1个管理串口;支持1个百兆健康管理网口:用于设备端口状态、电压、…...
Vue动态添加或删除DOM元素:购物车实例
Vue 指令系列文章: 《Vue插值:双大括号标签、v-text、v-html、v-bind 指令》 《Vue指令:v-cloak、v-once、v-pre 指令》 《Vue条件判断:v-if、v-else、v-else-if、v-show 指令》 《Vue循环遍历:v-for 指令》 《Vue事件处理:v-on 指令》 《Vue表单元素绑定:v-model 指令》…...
深入理解Agentic Workflows
本文来源:https://weaviate.io/blog/what-are-agentic-workflows 这篇文章将带你深入理解AI Agent、Agentic AI、Agentic Workflows、Agentic Architectures等概念,非常值得推荐。 一、什么是 AI Agents? AI Agents 是结合了大模型进行推理和…...
深入理解:阻塞IO、非阻塞IO、水平触发与边缘触发
深入理解:阻塞IO、非阻塞IO、水平触发与边缘触发 在网络编程和并发处理中,理解不同的 I/O 模型和事件通知机制至关重要。本文将深入探讨阻塞IO(Blocking IO)、非阻塞IO(Non-Blocking IO)、水平触发&#x…...
deepseek 技术的前生今世:从开源先锋到AGI探索者
一、引言:中国AI领域的“超越追赶”样本 DeepSeek(深度求索)作为中国人工智能领域的代表性企业,自2023年创立以来,凭借开源生态、低成本技术路径与多模态创新,迅速从行业新秀成长为全球AI竞赛中的关键力量…...
合规+增效 正也科技携智能营销产品出席中睿论坛
正也科技作为医药数字化领域的标杆企业,受邀参展第二届中睿医健产业企业家年会暨第十三届中睿医药新春论坛,本次论坛以“合力启新程”为主题,吸引了800多位医药健康企业的董事长、总经理参与,并通过主论坛、分论坛、路演等形式探讨…...
Python小练习系列 Vol.5:数独求解(经典回溯 + 剪枝)
🧠 Python小练习系列 Vol.5:数独求解(经典回溯 剪枝) 🧩 数独不仅是益智游戏,更是回溯算法的典范!本期我们将用 DFS 剪枝 的方式一步步求解一个标准 9x9 数独。 🧩 一、题目描述 …...
基于kafka的分布式日志收集平台项目(续)
#第一个容易错的地方 上次做到测试集群的创建topic时出现了错误 具体错误是配置信息出错了,然后报错如下: #现在来具体警戒哪些地方要特别注意: ### node.id 和listeners 和advertised.listeners这三行是每一台机器(每个节点&…...
C++运算符重载、类的转换构造函数和类型转换函数的基础练习
练习1:(困难) 建立一个矩阵类,可以完成指定的操作或运算。 说明: (1)、矩阵为2行3列,基类型为整型; (2)、操作或运算:初始化&…...
第一天 Linux驱动程序简介
目录 一、驱动的作用 二、裸机驱动 VS linux驱动 1、裸机驱动 2、linux驱动 三、linux驱动位于哪里? 四、应用编程 VS 内核编程 1、共同点 2、不同点 五、linux驱动分类 1、字符设备 2、块设备 3、网络设备 六、Linux驱动学习难点与误区 1、学习难点 …...
408 计算机网络 知识点记忆(1)
前言 本文基于王道考研课程与湖科大计算机网络课程教学内容,系统梳理核心知识记忆点和框架,既为个人复习沉淀思考,亦希望能与同行者互助共进。(PS:后续将持续迭代优化细节) 核心知识记忆点 计算机网络&a…...
scala简介和基础语法
Scala简介 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在 Java 虚拟机上,并兼容现有的 Java 程序。Scala 源代码被编译成 Java 字节码,所以它可…...
[特殊字符] Hyperlane:Rust 高性能 Web 框架的终极选择 [特殊字符]
🔥 Hyperlane:Rust高性能Web框架的终极选择 🔥 📈 性能封神:32万QPS碾压群雄 在1000并发压测中,Hyperlane以307,568.90 req/s的恐怖QPS稳居Rust生态第一,甚至超越Tokio框架!开启Kee…...
树莓派超全系列文档--(13)如何使用raspi-config工具其二
如何使用raspi-config工具其二 raspi-configPerformance optionsOverclockGPU memoryOverlay file systemFan Localisation optionsLocaleTime zoneKeyboardWLAN country Advanced optionsExpand filesystemNetwork interface namesNetwork proxy settingsBoot orderBootloader…...
瑞芯微 RKrga接口 wrapbuffer_virtualaddr 使用笔记
一、源码 官方在librga中给了很多 demo 以供参考,例如 imresize 操作: /** Copyright (C) 2022 Rockchip Electronics Co., Ltd.* Authors:* YuQiaowei <cerf.yurock-chips.com>** Licensed under the Apache License, Version 2.0 (the &qu…...
管理系统-接口信息
1.用户查询接口 1.1 查询所有用户 请求路径:GET /users 接口描述:查询所有用户的基本信息及关联的角色、应用数据。 请求参数:无 响应数据:{"code": 1,"msg": "success","data": [{&qu…...
java项目之基于ssm的乡镇自来水收费系统(源码+文档)
项目简介 乡镇自来水收费系统实现了以下功能: 乡镇自来水收费系统在Eclipse环境中,使用Java语言进行编码,使用Mysql创建数据表保存本系统产生的数据。系统可以提供信息显示和相应服务,其管理员管理水表,审核用户更换…...
基于高德地图实现地图交互功能的探索与总结
在前端开发项目中,集成地图功能并实现丰富的交互效果是一项具有挑战性但又极具实用价值的任务。最近,我在项目里负责实现基于高德地图的相关功能,包括地图初始化、输入提示、点击获取经纬度及地址等操作。在这个过程中,遇到了不少…...
代码随想录算法训练营--打卡day4
一.移除链表元素 1.题目链接 203. 移除链表元素 - 力扣(LeetCode) 2.思路 通过 while 循环来遍历链表,只要 cur 的下一个节点不为空,就继续循环。在循环中,对 cur 的下一个节点的值进行判断: 值不等于…...
【题解】AtCoder At_abc399_d [ABC399D] Switch Seats
题目大意 请点击 这里 查看原题面。 有一个长度为 2 ⋅ N 2\cdot N 2⋅N 的序列 A A A,其中 1 , 2 , … , N 1,2,\dots,N 1,2,…,N 各出现了两次。现在要找满足如下条件的数对 ( a , b ) (a,b) (a,b) 的个数: a a a 的两次出现不相邻。 b b b 的两…...
【力扣刷题|第十七天】0-1 背包 完全背包
目标和 力扣题目网址:目标和 这道题我们先用回溯的思想来做。首先我们设正数和为S,数组和为N,目标值为T,那么S-(N-S)T化简之后可以得S(TN)/2即选择的正数个数为偶数,而且NT也为偶数,那么第一个判断条件我们就有了&…...
实时目标检测新突破:AnytimeYOLO——随时中断的YOLO优化框架解析
目录 一、论文背景与核心价值 二、创新技术解析 2.1 网络结构革新:Transposed架构 2.2 动态路径优化算法 三、实验结果与性能对比 3.1 主要性能指标 3.2 关键发现 四、应用场景与部署实践 4.1 典型应用场景 4.2 部署注意事项 五、未来展望与挑战 一、论文背景与核心…...
Spring中的IOC及AOP概述
前言 Spring 框架的两大核心设计思想是 IOC(控制反转) 和 AOP(面向切面编程)。它们共同解决了代码耦合度高、重复逻辑冗余等问题。 IOC(控制反转) 1.核心概念 控制反转(Inversion of Control…...
为mariadb和mysql添加用户和修改密码的方法
一、查看MariaDB中的用户 步骤1:登录MariaDB sudo mysql -u root -p # 使用root账户登录(输入密码) 步骤2:查询用户列表 -- 切换到mysql系统数据库 USE mysql; -- 查看所有用户及其主机权限 SELECT User, Host FROM user; 输出…...
2025年3月电子学会c++五级真题
结绳 #include <bits/stdc.h> using namespace std;int n,a[10010];int main() {cin>>n;for(int i 0;i<n;i){cin>>a[i];}sort(a0,an);//将a数组从小到大排序double sum 0;for(int i 0;i<n;i){sum (suma[i])/2;}cout<<(int)sum;return 0; } 最…...
JSP 指令
JSP 指令 概述 JSP(JavaServer Pages)是一种动态网页技术,它允许开发者在HTML页面中嵌入Java代码,从而实现动态内容的生成。JSP指令是JSP页面中用于设置整个页面属性的特殊标记,它们对整个JSP页面或部分页面进行配置…...
RabbitMQ高级特性--发送方确认
目录 1. confirm确认模式 1.配置RabbitMQ 2.设置确认回调逻辑并发送消息 2.Return退回模式 1.配置RabbitMQ 2.设置返回回调逻辑并发送消息 在使用RabbitMQ的时候, 可以通过消息持久化来解决因为服务器的异常崩溃而导致的消息丢失, 但是还有⼀个问题, 当消息的生产者将消息发送出…...
AUTOSAR_StbM_详解
AUTOSAR同步时基管理器(StbM)详解 基于AUTOSAR规范对StbM模块架构与功能的全面解析 目录 AUTOSAR同步时基管理器(StbM)详解 目录1. 概述 1.1 StbM的功能与用途1.2 StbM的主要用例2. 组件架构 2.1 StbM组件架构图2.2 组件交互说明 2.2.1 客户类型2.2.2 内部组件2.2.3 外部接口3.…...
扩散模型总结
目录 定义与原理 发展历程 正向扩散过程 反向扩散过程 噪声预测网络 离散时间模型 连续时间模型 条件扩散模型 生成质量 训练稳定性 采样灵活性 图像生成 音频合成 文本生成 计算效率 模型复杂度 定义与原理 扩散模型是一种新型的生成模型,其核心原理源于热力…...
RCE--解法
目录 一、利用php伪协议 1.代码分析 2.过程 3.结果 编辑 4.防御手段 二、RCE(php中点的构造) 1.代码分析 2.过程 一、利用php伪协议 <?php error_reporting(0); if(isset($_GET[c])){$c $_GET[c];if(!preg_match("/flag|system|php|cat|sort…...
Kubernetes》k8s》Containerd 、ctr 、cri、crictl
containerd ctr crictl ctr 是 containerd 的一个客户端工具。 crictl 是 CRI 兼容的容器运行时命令行接口,可以使用它来检查和调试 k8s 节点上的容器运行时和应用程序。 ctr -v 输出的是 containerd 的版本, crictl -v 输出的是当前 k8s 的版本&#x…...
OpenCV 图形API(2)为什么需要图形API?
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 G-API背后的动机 G-API模块为OpenCV带来了基于图的执行模型。本章简要描述了这种新模型如何在两个方面帮助软件开发者:优化和移植图像处理算法…...
测试模版12
本篇技术博文摘要 🌟 引言 📘 在这个变幻莫测、快速发展的技术时代,与时俱进是每个IT工程师的必修课。我是盛透侧视攻城狮,一名什么都会一丢丢的网络安全工程师,也是众多技术社区的活跃成员以及多家大厂官方认可人员&a…...
Epoll 的本质与原理:高性能网络编程的基石
Epoll 的本质与原理:高性能网络编程的基石 在当今高并发的网络应用中,如何高效地处理大量的并发连接是每个开发者都需要面对的关键问题。Linux 系统提供的 epoll 技术正是解决这一问题的利器,被广泛应用于 Nginx、Redis、Skynet 等高性能网络…...
Tesseract OCR技术初探(Python调用)
一、Tesseract OCR技术解析 1.1 核心架构与发展历程 Tesseract是由HP实验室于1985年研发的光学字符识别引擎,2005年由Google开源并持续维护至今。其核心技术经历了三个阶段演进: 传统模式(v3.x):基于特征匹配算法&a…...
黑盒测试的测试用例构成的八点要素
测试用例: 是为测试项目而设计的执行文档 作用: 防止漏测实施测试的标准 编写格式: 用例编号:项目 模块 编号用例标题:预期结果(测试点)模块/项目:所属项目或模块优先级:表示用例的重要程度或者影响力P0~p4(P0最高)前置条件:要执行此条用例…...
手撕string
目录 引言 1,成员变量 2,先建一个可以跑的 2_1,构造函数 2_2, 扩容函数reserve 2_3,push_back 2_4,append[ ] 2_5,operator << 2_6,测试一下,看猪跑 3&…...
12款星光闪光污迹艺术绘画效果Clip Studio Paint笔刷画笔+闪光纹理图片 Clip Studio Glitter Texture Brushes
这 12 种 Clip Studio 画笔 额外的闪光纹理包含闪光、污迹、星光和闪亮的斑点,为您的艺术增添额外的流行感。想想闪光胶,但已经长大了(而且更好)。想象一下:无论您是用微小的闪光还是厚实的微光涂鸦,都有适…...
5G_WiFi_CE_杂散测试
目录 一、规范要求 1、法规目录: 2、限值: (1)带外发射杂散 (2)带内发射杂散 (3)接收杂散 二、测试方法 1、带外发射杂散 (1)测试条件 (…...
蓝卓为中小制造企业注入数字化转型活力
随着劳动力成本上升,原材料价格上涨,企业生产成本逐年增加,市场竞争越来越激烈,传统的中小制造企业面临着巨大的压力。 通过数字化转型应对环境的变化已成为行业共识,在数字化的进程中,中小企业首要考虑生存问题,不能…...