C++学习:六个月从基础到就业——C++11/14:auto类型推导
C++学习:六个月从基础到就业——C++11/14:auto类型推导
本文是我C++学习之旅系列的第四十一篇技术文章,也是第三阶段"现代C++特性"的第三篇,主要介绍C++11/14中的auto类型推导机制。查看完整系列目录了解更多内容。
引言
在现代C++编程中,auto
关键字是最常用也最重要的特性之一。C++11重新定义了这个在C++98标准中几乎无人使用的关键字,赋予它自动类型推导的能力,使代码更加简洁和灵活。C++14进一步扩展了auto
的使用范围,让它成为提高代码可读性和维护性的强大工具。本文将深入介绍auto
关键字的工作原理、使用场景以及最佳实践,帮助你在日常C++编程中合理利用这一现代特性。
目录
- C++11/14:auto类型推导
- 引言
- 目录
- auto基础
- auto的概念和历史
- 基本语法和使用
- auto的类型推导规则
- 1. 忽略引用限定符
- 2. 忽略顶层const限定符
- 3. 数组和函数衰减规则
- 4. 花括号初始化的特殊规则
- C++14中的auto增强
- 函数返回类型推导
- Lambda表达式中的auto参数
- 变量模板中的auto
- 实际应用场景
- 1. 简化迭代器声明
- 2. 处理复杂类型
- 3. 避免类型书写错误
- 4. 与lambdas和std::bind配合使用
- 5. 函数返回类型推导
- auto的最佳实践与注意事项
- 何时使用auto
- 何时避免使用auto
- 常见误区和避坑指南
- 实际代码示例
- 示例1:简化STL算法使用
- 示例2:利用auto实现泛型函数
- 示例3:结合auto与结构化绑定(C++17)
- auto在现代C++中的地位
- 总结
auto基础
auto的概念和历史
在C++11之前,auto
关键字是一个存储类说明符,用于声明自动存储持续时间的变量(这基本上是局部变量的默认行为)。由于几乎没有实际用途,这个关键字几乎被所有C++程序员遗忘。
C++11彻底改变了auto
的含义,将其重新定义为一个类型占位符,让编译器根据初始化表达式自动推导变量的类型。这大大简化了复杂类型的声明,特别是在使用模板和STL时。
基本语法和使用
auto
的基本使用非常简单:
#include <iostream>
#include <vector>
#include <string>int main() {// 整数类型推导auto i = 42; // intauto u = 42u; // unsigned intauto l = 42l; // longauto ll = 42ll; // long long// 浮点类型推导auto f = 2.5f; // floatauto d = 2.5; // double// 指针类型推导int x = 10;auto p = &x; // int*// 引用类型推导(auto默认会忽略引用)int& rx = x;auto rx_copy = rx; // int,不是int&// 显式指定为引用类型auto& rx_ref = rx; // int&// 常量类型推导(auto默认会忽略const顶层限定符)const int cx = 20;auto cx_copy = cx; // int,不是const int// 显式指定为const类型const auto cx_const = cx; // const intstd::cout << "Types deduced by auto:" << std::endl;std::cout << "i: " << typeid(i).name() << std::endl;std::cout << "f: " << typeid(f).name() << std::endl;std::cout << "p: " << typeid(p).name() << std::endl;std::cout << "rx_copy: " << typeid(rx_copy).name() << std::endl;std::cout << "rx_ref: " << typeid(rx_ref).name() << std::endl;return 0;
}
auto的类型推导规则
auto
类型推导遵循以下基本规则,这些规则与模板类型推导非常相似:
1. 忽略引用限定符
当使用auto
声明一个变量并通过引用进行初始化时,auto
会忽略引用限定符:
int x = 10;
int& rx = x;
auto a = rx; // a的类型是int,而不是int&
如果需要保留引用语义,需要显式使用auto&
:
auto& ar = rx; // ar的类型是int&
2. 忽略顶层const限定符
类似地,auto
会忽略顶层const
限定符(即直接修饰变量本身的const),但保留底层const
限定符(修饰指针或引用指向的对象的const):
const int c = 42;
auto a = c; // a的类型是int,而不是const intconst int* pc = &c;
auto ptr = pc; // ptr的类型是const int*,保留了底层constint i = 10;
const int& rc = i;
auto copy = rc; // copy的类型是int,忽略了引用和顶层const
auto& ref = rc; // ref的类型是const int&,保留了底层const
如果需要保留顶层const
,需要显式使用const auto
:
const auto ca = c; // ca的类型是const int
3. 数组和函数衰减规则
使用auto
推导数组类型时,结果会衰减为指针类型:
int arr[5] = {1, 2, 3, 4, 5};
auto a = arr; // a的类型是int*,而不是int[5]
同样,函数类型也会衰减为函数指针:
void func(int);
auto f = func; // f的类型是void(*)(int),而不是void(int)
如果要保留数组类型或函数类型,需要使用auto&
:
auto& array_ref = arr; // array_ref的类型是int(&)[5]
auto& func_ref = func; // func_ref的类型是void(&)(int)
4. 花括号初始化的特殊规则
C++11中,当使用花括号初始化表达式初始化auto
变量时,推导的类型是std::initializer_list<T>
:
auto a = {1, 2, 3}; // std::initializer_list<int>
然而,在C++17中,这个规则有了变化。如果花括号中只有一个元素,那么类型推导会直接得到该元素的类型:
// C++17
auto a = {42}; // C++11: std::initializer_list<int>,C++17: int
C++14中的auto增强
C++14进一步扩展了auto
的使用范围:
函数返回类型推导
在C++14中,auto
可以用作函数返回类型,编译器会根据return
语句推导出函数的返回类型:
// C++14
auto add(int a, int b) {return a + b; // 返回类型被推导为int
}auto getValues() {return std::vector<int>{1, 2, 3}; // 返回类型被推导为std::vector<int>
}
对于具有多个return
语句的函数,所有return
语句必须返回相同的类型,或者能够隐式转换为同一类型:
auto getNumber(bool condition) {if (condition) {return 42; // int} else {return 42.0; // double}// 返回类型被推导为double(int可以隐式转换为double)
}
Lambda表达式中的auto参数
C++14允许在lambda表达式的参数列表中使用auto
关键字,创建所谓的"泛型lambda":
// C++14泛型lambda
auto printValue = [](const auto& value) {std::cout << "Value: " << value << std::endl;
};printValue(42); // 打印整数
printValue(3.14); // 打印浮点数
printValue("Hello"); // 打印字符串
printValue(std::vector<int>{1, 2, 3}); // 打印容器(如果有合适的<<运算符)
这个特性实质上是一个语法糖,编译器会将其转换为一个函数调用运算符模板:
// 编译器生成的等效代码
struct {template<typename T>void operator()(const T& value) const {std::cout << "Value: " << value << std::endl;}
} printValue;
变量模板中的auto
C++14引入了变量模板,配合auto
可以创建更灵活的模板:
// C++14变量模板
template<typename T>
constexpr auto TypeSize = sizeof(T);std::cout << "Size of int: " << TypeSize<int> << std::endl;
std::cout << "Size of double: " << TypeSize<double> << std::endl;
实际应用场景
auto
在现代C++编程中有广泛的应用场景:
1. 简化迭代器声明
在使用STL容器的迭代器时,auto
可以大大简化代码:
#include <map>
#include <string>
#include <iostream>int main() {std::map<std::string, std::vector<int>> data = {{"Alice", {1, 2, 3}},{"Bob", {4, 5, 6}},{"Charlie", {7, 8, 9}}};// 不使用auto的冗长写法for (std::map<std::string, std::vector<int>>::const_iterator it = data.begin();it != data.end(); ++it) {std::cout << it->first << ": ";for (std::vector<int>::const_iterator vecIt = it->second.begin();vecIt != it->second.end(); ++vecIt) {std::cout << *vecIt << " ";}std::cout << std::endl;}// 使用auto的简洁写法for (const auto& [name, values] : data) { // C++17结构化绑定std::cout << name << ": ";for (const auto& value : values) {std::cout << value << " ";}std::cout << std::endl;}return 0;
}
2. 处理复杂类型
当类型名称非常长或复杂时,auto
特别有用:
#include <functional>
#include <memory>// 不使用auto的复杂类型声明
std::unique_ptr<std::unordered_map<std::string, std::function<double(double, double)>>> calculators = std::make_unique<std::unordered_map<std::string, std::function<double(double, double)>>>();// 使用auto的简洁写法
auto calculators = std::make_unique<std::unordered_map<std::string, std::function<double(double, double)>>>();
3. 避免类型书写错误
auto
可以帮助避免手动声明类型时的拼写错误:
// 可能的错误写法
std::vector<int>::const_iterator it = vec.cbegin(); // 使用const_iterator而不是iterator// 使用auto的安全写法
auto it = vec.cbegin(); // 总是与vec.cbegin()返回的确切类型匹配
4. 与lambdas和std::bind配合使用
auto
特别适合存储lambdas和std::bind
结果,因为这些表达式的类型通常很复杂且难以手动编写:
#include <functional>
#include <iostream>int main() {// 存储lambda表达式auto add = [](int a, int b) { return a + b; };// 存储std::bind结果auto multiply = std::bind(std::multiplies<int>(), std::placeholders::_1, 10);std::cout << "5 + 3 = " << add(5, 3) << std::endl;std::cout << "5 * 10 = " << multiply(5) << std::endl;return 0;
}
5. 函数返回类型推导
在C++14中,auto
可以简化函数实现,特别是对于模板函数和返回类型依赖于输入的函数:
// 返回类型依赖于输入的函数
template<typename T1, typename T2>
auto multiply(T1 a, T2 b) {return a * b; // 返回类型取决于a和b的类型
}// 使用示例
auto result1 = multiply(5, 3); // int
auto result2 = multiply(5.0, 3); // double
auto result3 = multiply(5, 3.5); // double
auto的最佳实践与注意事项
何时使用auto
以下场景特别适合使用auto
:
-
迭代器和复杂类型声明:
for (auto it = container.begin(); it != container.end(); ++it) { ... }
-
lambda表达式:
auto processItems = [](const auto& container) { ... };
-
推导的类型明显的场景:
auto result = function(); // 当function()的返回类型明显时
-
类型冗长难写的场景:
auto factory = std::make_shared<MyFactory<int, std::string>>();
-
模板中的类型推导:
template <typename Container> void process(const Container& c) {for (const auto& item : c) { ... } }
何时避免使用auto
以下场景应该谨慎或避免使用auto
:
-
导致代码可读性降低的情况:
auto x = getValue(); // 如果不查看getValue()的定义,无法知道x的类型
-
需要明确指定类型的情况:
auto value = getIntOrDouble(); // 如果需要特定类型,应该明确指定
-
可能引起隐式转换问题的情况:
auto size = vec.size(); // size()返回size_type,可能是unsigned,在计算时可能导致意外问题
-
类型绑定不明确的情况:
auto&& x = getValue(); // 转发引用,类型绑定规则复杂
常见误区和避坑指南
-
auto与引用
记住
auto
默认会忽略引用限定符:int x = 10; int& rx = x; auto a = rx; // a是int,不是int& auto& b = rx; // b是int&a = 20; // 不影响x b = 30; // 修改了x的值
-
auto与const
auto
默认会忽略顶层const限定符:const int c = 10; auto a = c; // a是int,不是const int const auto b = c; // b是const inta = 20; // 合法,a不是const // b = 30; // 错误,b是const
-
auto与花括号初始化
C++11中使用花括号初始化
auto
变量会创建std::initializer_list
:auto a = {1, 2, 3}; // std::initializer_list<int>
-
auto与代码可读性
过度使用
auto
可能导致代码难以理解:// 不好的例子:类型不明确 auto result = process(data);// 更好的例子:添加注释说明类型或使用有意义的变量名 auto userCount = getUserCount(); // 变量名暗示了类型
-
auto与类型窄化
使用
auto
时要注意类型窄化问题:double d = 3.14; auto a = static_cast<int>(d); // a是int,已经窄化
实际代码示例
示例1:简化STL算法使用
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>int main() {std::vector<int> numbers(10);// 使用auto简化STL算法代码std::iota(numbers.begin(), numbers.end(), 1); // 填充1到10// 计算所有偶数的和auto sum = std::accumulate(numbers.begin(), numbers.end(),0,[](auto total, auto num) {return (num % 2 == 0) ? total + num : total;});std::cout << "Sum of even numbers: " << sum << std::endl;// 查找第一个大于5的数auto it = std::find_if(numbers.begin(), numbers.end(),[](auto n) { return n > 5; });if (it != numbers.end()) {std::cout << "First number > 5: " << *it << std::endl;}// 转换数据std::vector<double> doubles;std::transform(numbers.begin(), numbers.end(), std::back_inserter(doubles),[](auto n) { return n * 1.5; });std::cout << "Transformed values: ";for (const auto& d : doubles) {std::cout << d << " ";}std::cout << std::endl;return 0;
}
示例2:利用auto实现泛型函数
#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <string>// C++14泛型函数,处理任何容器
template<typename Container>
auto sumContainer(const Container& container) {using std::begin;using std::end;// 使用容器元素类型作为sum的类型using ValueType = typename std::iterator_traits<decltype(begin(container))>::value_type;ValueType sum{};for (const auto& item : container) {sum += item;}return sum;
}// C++14:处理特定容器的偏特化版本
auto sumContainer(const std::map<std::string, int>& container) {int sum = 0;for (const auto& [key, value] : container) {sum += value;}return sum;
}int main() {std::vector<int> vec = {1, 2, 3, 4, 5};std::list<double> lst = {1.1, 2.2, 3.3, 4.4, 5.5};std::map<std::string, int> m = {{"one", 1},{"two", 2},{"three", 3}};auto vecSum = sumContainer(vec);auto lstSum = sumContainer(lst);auto mapSum = sumContainer(m);std::cout << "Vector sum: " << vecSum << std::endl;std::cout << "List sum: " << lstSum << std::endl;std::cout << "Map sum: " << mapSum << std::endl;return 0;
}
示例3:结合auto与结构化绑定(C++17)
#include <iostream>
#include <map>
#include <tuple>
#include <string>// 一个返回多个值的函数
auto getUserInfo() {return std::make_tuple("John Doe", 30, true);
}int main() {// 使用auto和结构化绑定接收多个返回值auto [name, age, active] = getUserInfo();std::cout << "User: " << name << ", Age: " << age << ", Active: " << std::boolalpha << active << std::endl;// 迭代map并使用结构化绑定std::map<std::string, std::pair<int, bool>> users = {{"john", {25, true}},{"jane", {28, false}},{"bob", {32, true}}};for (const auto& [username, userInfo] : users) {const auto& [userAge, userActive] = userInfo;std::cout << "Username: " << username<< ", Age: " << userAge<< ", Active: " << userActive << std::endl;}return 0;
}
auto在现代C++中的地位
随着C++的演进,auto
已经成为现代C++编程风格的核心元素之一。它与其他C++11/14/17特性(如lambda表达式、范围for循环、结构化绑定等)协同工作,共同推动了C++代码的简洁性和表达力。
然而,与任何强大工具一样,auto
需要理性使用。关键是在代码清晰度和简洁性之间找到平衡点。遵循"让明显的事情保持明显"的原则,当类型明显或命名足够表达意图时,auto
可以带来好处;而当类型重要且不明显时,应考虑显式声明类型。
总结
auto
关键字是现代C++中简化代码、提高可读性和维护性的重要工具。它通过自动类型推导,消除了手动编写复杂类型的需要,适合用于迭代器声明、lambda表达式存储、复杂类型处理等场景。
C++14进一步扩展了auto
的应用范围,使其可用于函数返回类型推导和lambda参数,让C++代码更加灵活和表达力强。
要有效使用auto
,需要理解其类型推导规则,包括如何处理引用、const修饰符、数组和函数衰减等特性。同时,应当在代码清晰性和简洁性之间找到平衡,避免过度使用导致代码难以理解。
在下一篇文章中,我们将继续探索现代C++的类型推导机制,详细讨论decltype
关键字,它如何与auto
配合使用,以及在模板编程中的重要应用。
这是我C++学习之旅系列的第四十一篇技术文章。查看完整系列目录了解更多内容。
相关文章:
C++学习:六个月从基础到就业——C++11/14:auto类型推导
C学习:六个月从基础到就业——C11/14:auto类型推导 本文是我C学习之旅系列的第四十一篇技术文章,也是第三阶段"现代C特性"的第三篇,主要介绍C11/14中的auto类型推导机制。查看完整系列目录了解更多内容。 引言 在现代C…...
select语句的书写顺序
一.MySQL SELECT语句的执行顺序 MySQL中SELECT语句的执行顺序与SQL语句的书写顺序不同,理解这个执行顺序对于编写高效查询非常重要。 1.标准SELECT语句的执行顺序 FROM子句(包括JOIN操作) 首先确定数据来源表执行表连接操作 WHERE子句 对F…...
OpenWebUI新突破,MCPO框架解锁MCP工具新玩法
大家好,Open WebUI 迎来重要更新,现已正式支持 MCP 工具服务器,但 MCP 工具服务器需由兼容 OpenAPI 的代理作为前端。mcpo 是一款实用代理,经测试,它能让开发者使用 MCP 服务器命令和标准 OpenAPI 服务器工具ÿ…...
【Day28】
总结: Python 通过缩进来定义代码块的结构。当解释器遇到像 def, class, if, for 这样的语句,并且后面跟着冒号 : 时,它就期望接下来会有一个或多个缩进的语句来构成这个代码块。如果它没有找到任何缩进的语句(即代码块是空的&am…...
STM32 | FreeRTOS 消息队列
01 一、概述 队列又称消息队列,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断和任务间传递信息,实现了任务接收来自其他任务或中断的不固定长度的消息,任务能够从队列里面读取消息,当队列中的消…...
Vue-事件修饰符
事件修饰符 prevent (阻止默认事件) 超链接 点击事件 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>事件修饰符</title><!-- 引入Vue --><script …...
c++函数调用运算符及类型转换运算符重载
author: hjjdebug date: 2025年 05月 17日 星期六 14:44:48 CST descrip: c函数调用运算符及类型转换运算符重载 文章目录 0. 前言. 运算符包括以下运算符.1. 运算符重载语句一般格式:2. 函数调用运算符:3. 类型转换运算符: 例如 int(); double(); bool(…...
如何在 Windows 10 或 11 中安装 PowerShellGet 模块?
PowerShell 是微软在其 Windows 操作系统上提供的强大脚本语言,可用于通过命令行界面自动化各种任务,适用于 Windows 桌面或服务器环境。而 PowerShellGet 是 PowerShell 中的一个模块,提供了用于从各种来源发现、安装、更新和发布模块的 cmdlet。 本文将介绍如何在 PowerS…...
84.评论日记
原链接 这个视频我发了四五条评论。评论内容甚至和下面这个视频内的其他评论一样。 找了另外的账号也发了。 发现,无论是我这个账号,还是其他的账号,评论都无法看到。 我大胆猜测有一种机制,某些官号会被设置成一种高检测的等…...
一周学会Pandas2 Python数据处理与分析-Pandas2数据添加修改删除操作
锋哥原创的Pandas2 Python数据处理与分析 视频教程: 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 对数据的修改、增加和删除在数据整理过程中时常发生。修改的情况一般是修改错误,还有一种情况是格式转换…...
荷兰国旗问题 之 指针划分区间问题
文章目录 首先介绍一下什么是荷兰国旗问题?问题描述为:给定一个由红色、白色和蓝色三种颜色组成的无序数组,将数组元素按颜色排序,使得所有红色元素在前,白色元素居中,蓝色元素在后。这里的 “颜色” 通常用…...
冒泡排序-java
public class BubbleSort{ public static void bubbleSort(int[] arr) { int n arr.length; boolean swapped; // 外层循环控制遍历的轮数 for (int i 0; i < n - 1; i) { swapped false; for (int j 0; …...
进阶-数据结构部分:2、常用排序算法
飞书文档https://x509p6c8to.feishu.cn/wiki/FfpIwIPtviMMb4kAn3Sc40ABnUh 常用排序算法 这几种算法都是常见的排序算法,它们的优劣和适用场景如下: 冒泡排序(Bubble Sort):简单易懂,时间复杂度较高&…...
人工智能-自然语言与语音产品实现
一、语义相似度 (一)、文本向量化 1、文本向量化(Text Vectorization) 是自然语言处理(NLP)中的核心预处理步骤,旨在将人类语言的文本转换为计算机可处理的数值向量(数学表达&…...
阿里巴巴开源移动端多模态LLM工具——MNN
MNN 是一个高效且轻量级的深度学习框架。它支持深度学习模型的推理和训练,并在设备端的推理和训练方面具有行业领先的性能。目前,MNN 已集成到阿里巴巴集团的 30 多个应用中,如淘宝、天猫、优酷、钉钉、闲鱼等,覆盖了直播、短视频…...
SpringBootAdmin:全方位监控与管理SpringBoot应用
监控的意义 1. 监控服务状态是否宕机 2. 监控服务运行指标 (内存,虚拟机,线程,请求等) 3. 监控日志 4. 管理服务 (服务下线) 可视化监控平台 Spring Boot Admin, 开源社区项目, 用于管理和监控SpringBoot应用程序. 客户端注册到服务端, 通过HTTP请求方式, 服务端定期从客…...
SAP HCM 0008数据存储逻辑
0008信息类型:0008信息类型是存储员工基本薪酬的地方,因为很多企业都会都薪酬带宽,都会按岗定薪,所以在上线前为体现工资体系的标准化,都会在配置对应的薪酬关系,HCM叫间接评估,今天我们就分析下…...
【springcloud学习(dalston.sr1)】Config配置中心-ConfigServer端与Git通信(含源代码)(十三)
该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍(含源代码)(一) springcloud学习(dalston.sr1)系统文章汇总如下: 【springcloud学习(dalston…...
2020CCPC河南省赛题解
A. 班委竞选 签到题,模拟。 #include <bits/stdc.h> #define x first #define y second #define int long long //#define double long doubleusing namespace std; typedef unsigned long long ULL ; typedef pair<int,int> PII ; typedef pair<d…...
C语言输入函数对比解析
目录 C语言输入函数全家福(和它们的秘密)fgetsgetsscanfgetcharfscanf函数对比表灵魂总结 哈哈,看来你正在和C语言的输入函数们玩“大家来找茬”!放心,我会用最接地气的方式给你讲明白,保证比看《甄嬛传》还…...
python四则运算计算器
python四则运算计算器 是谁说,python不好写计算器的,我亲自写个无ui的计算器功能,证明这是谣言 step1:C:\Users\wangrusheng\Downloads\num.txt 15 - 4 * 3 10 / 2(5 3) * 2 6 / 31/2 * 8 3/4 * 4 - 0.52.5 * (4 1.6) - 9 / 3-6 12 * (…...
BUUCTF——Nmap
BUUCTF——Nmap 进入靶场 类似于一个nmap的网站 尝试一下功能 没什么用 看看数据包 既然跟IP相关 伪造一个XXF看看 拼接了一下没什么用 果然没这么简单 尝试一下命令注入 构造payload 127.0.0.1 | ls 应该有过滤 加了个\ 直接构造个php木马上传试试 127.0.0.1 | <?…...
【Changer解码头详解及融入neck层数据的实验设计】
Changer解码头详解 ChangerEx中的 Changer 解码头(定义在 [changer.py](file://opencd\models\decode_heads\changer.py))是基于双时相输入的,用于遥感变化检测任务。下面我将详细解释: 🎯 一、解码头输入数据来源 输…...
深度学习推理引擎---OpenVINO
OpenVINO(Open Visual Inference & Neural Network Optimization Toolkit)是英特尔开发的开源工具套件,旨在优化和加速深度学习模型在英特尔硬件(CPU、GPU、VPU、FPGA等)上的推理性能,同时支持从训练到…...
JavaScript splice() 方法
1. JavaScript splice() 方法 1.1. 定义和用法 splice() 方法用于添加或删除数组中的元素。 注意:这种方法会改变原始数组。 返回值:如果删除一个元素,则返回一个元素的数组。 如果未删除任何元素,则返回空数组。 1.2. …...
数据库故障排查指南:解决常见问题,保障数据安全与稳定
数据库故障排查指南:解决常见问题,保障数据安全与稳定 📖 前言 数据库作为现代应用的核心组件,其稳定性直接影响业务连续性。本文总结六大常见数据库故障场景,提供快速排查思路与解决方案,助你化身"…...
gem5-gpu教程 第十章 关于topology 的Mesh network
问题一、L1和L2缓存之间的VI_hammer_fusion中指定了互连延迟,如何更改这些数字吗? 我已经实现了一个网格拓扑来连接cpu内核和GPU SM,并对VI_hammer*和网格文件进行了所有必要的更改。我的问题是: 1. There is interconnect latency specified in VI_hammer_fusion betwee…...
【C/C++】C++返回值优化:RVO与NRVO全解析
文章目录 C返回值优化:RVO与NRVO全解析1 简介2 RVO vs NRVO3 触发条件4 底层机制5 应用场景6 验证与限制7 性能影响8 补充说明9 总结 C返回值优化:RVO与NRVO全解析 返回值优化(Return Value Optimization, RVO)是编译器通过消除临…...
使用 Kaniko来构建镜像
使用 Kaniko来构建镜像 Kaniko 是一种专注于容器镜像构建的开源工具,其核心设计理念与 Docker 存在显著差异。以下从功能定位、技术实现和适用场景三方面进行对比分析: 一、Kaniko 的核心特性 无需 Docker 守护进程 Kaniko 直接在容器或 Kubernetes 集…...
2025.05.17淘天机考笔试真题第三题
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 奇偶平衡树分割问题 问题描述 K小姐是一位园林设计师,她设计了一个由多个花坛组成的树形公园。每个花坛中种植了不同数量的花…...
history模式:让URL更美观
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...
算法:分治法
实验内容 在一个2kⅹ2k个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为特殊方格,且称该棋盘为一特殊棋盘。 显然,特殊方格出现的位置有4k 种情况,即k>0,有4k 种不同的特殊棋盘 棋盘覆盖:…...
豆粕ETF投资逻辑整理归纳-20250511
目录 一、什么是豆粕 基本概念 豆粕上游生产国 豆粕下游消耗方 二、豆粕ETF 概念 策略 展期操作 超额收益 行情波动 豆粕资产的低相关性 三、展期收益 Contango升水结构和Backwardation贴水结构 豆粕的贴水逻辑 还有哪些品种拥有长期的展期收益 四、其他相关信…...
使用 Python 连接 Oracle 23ai 数据库完整指南
方法一:使用 oracledb 官方驱动(推荐) Oracle 官方维护的 oracledb 驱动(原 cx_Oracle)是最新推荐方案,支持 Thin/Thick 两种模式。 1. 环境准备 pip install oracledb2. 完整示例代码 import oracledb import getpass from typing import Unionclass Oracle23aiConn…...
构建集成差异化灵巧手和先进机器人控制技术的自动化系统
介绍程序 1.流程分析 通过流程分析审查应用机器人自动化的可行性。 2.系统设计 选择合适的机器人(机械臂、夹持器、视觉系统等),并通过详细的任务分析设计最佳系统。 3.内部测试 建立内部测试平台并解决任何问题。 4.现场测试 现场设…...
题单:汉诺塔问题
题目描述 如下图所示,设有 nn 个大小不等的中空圆盘,按照从小到大的顺序叠套在立柱 A 上,另有两根立柱 B 和 C 。 现在要求把全部圆盘从 A 柱(称为源柱)移到 C 柱(称为目标柱),移动…...
Unable to get end effector tips from jmg
这个错误信息表明在使用MoveIt2时,moveit_visual_tools无法从关节模型组(Joint Model Group,简称JMG)中获取末端执行器(End Effector,简称EE)的尖端信息。这通常是因为配置文件中缺少相关信息&a…...
flutter flutter run 运行项目卡在Running Gradle task ‘assembleDebug‘...
flutter run --verbose在运行flutter run 可以看到是卡在哪一步 最重要的就是自己查看日志,具体哪一步有问题flutter run --verbose使用这个,运行了项目会将错误信息放在控制台 可能原因 静态资源问题如果:图片、字体文件等没有在pubspec.yam…...
STM32烧录程序正常,但是运行异常
一、硬件配置问题 BOOT引脚设置错误 STM32的启动模式由BOOT0和BOOT1引脚决定。若设置为从RAM启动(BOOT01,BOOT10),程序在掉电后无法保存,导致复位后无法正常运行。应确保BOOT00(从Flash启动)15。…...
TTS:F5-TTS 带有 ConvNeXt V2 的扩散变换器
1,项目简介 F5-TTS 于英文生成领域表现卓越,发音标准程度在本次评测软件中独占鳌头。再者,官方预设的多角色生成模式独具匠心,能够配置多个角色,一次性为多角色、多情绪生成对话式语音,别出心裁。 最低配置…...
ecmascript 第6版特性 ECMA-262 ES6
https://blog.csdn.net/zlpzlpzyd/article/details/146125018 在之前写的文章基础上,ES6在export和import的基础外,还有如下特性 特性说明let/const块级作用域变量声明>箭头函数Promise异步编程...
2024 山东省ccpc省赛
目录 I(签到) 题目简述: 思路: 代码: A(二分答案) 题目简述: 思路: 代码: K(构造) 题目: 思路: 代…...
角点特征:从传统算法到深度学习算法演进
1 概述 图像特征是用来描述和分析图像内容的关键属性,通常包括颜色、纹理和形状等信息。颜色特征能够反映图像中不同颜色的分布,常通过 RGB 值或色彩直方图表示。纹理特征则关注图像表面的结构和细节,例如通过灰度共生矩阵或局部二值模式&…...
免费代理IP服务有哪些隐患?如何安全使用?
代理IP已经成为互联网众多用户日常在线活动中不可或缺的一部分。无论是为了保护个人隐私、突破地理限制,还是用于数据抓取、广告投放等商业用途,代理IP都扮演着关键角色。然而,市场上存在大量的免费代理IP服务,尽管它们看起来颇具…...
深入了解 VPC 端点类型 – 网关与接口
什么是VPC 端点 VPC 端点(VPC Endpoint)是 Amazon Web Services (AWS) 提供的一种服务,允许用户在 Virtual Private Cloud (VPC) 内部安全地访问 AWS 服务,而无需通过公共互联网。VPC 端点通过私有连接将 VPC 与 AWS 服务直接连接…...
Android屏幕采集编码打包推送RTMP技术详解:从开发到优化与应用
在现代移动应用中,屏幕采集已成为一个广泛使用的功能,尤其是在实时直播、视频会议、远程教育、游戏录制等场景中,屏幕采集技术的需求不断增长。Android 平台为开发者提供了 MediaProjection API,这使得屏幕录制和采集变得更加简单…...
信息系统项目管理师高级-软考高项案例分析备考指南(2023年案例分析)
个人笔记整理---仅供参考 计算题 案例分析里的计算题就是进度、挣值分析、预测技术。主要考査的知识点有:找关键路径、求总工期、自由时差、总时差、进度压缩资源平滑、挣值计算、预测计算。计算题是一定要拿下的,做计算题要保持头脑清晰,认真读题把PV、…...
全栈项目搭建指南:Nuxt.js + Node.js + MongoDB
全栈项目搭建指南:Nuxt.js Node.js MongoDB 一、项目概述 我们将构建一个完整的全栈应用,包含: 前端:Nuxt.js (SSR渲染)后端:Node.js (Express/Koa框架)数据库:MongoDB后台管理系统:集成在同…...
Linux:基础IO
一:理解文件 1-1 狭义理解 文件存储在磁盘中,由于磁盘是永久性存储介质,因此文件在磁盘上的存储是永久性的;磁盘也是外设,因此磁盘上对文件的所有操作本质是对外设的输入和输出 1-2 广义理解 Linux下一切皆文件&am…...
MySQL 索引优化以及慢查询优化
在数据库性能优化中,索引优化和慢查询优化是两个关键环节。合理使用索引可以显著提高查询效率,而识别和优化慢查询则能提升整体数据库性能。本文将详细介绍MySQL索引优化和慢查询优化的方法和最佳实践。 一、MySQL 索引优化 1.1 索引的基本概念 索引是…...