【C++】深入理解C++中的类型推导:从auto到decltype的应用与实践
C++11引入了类型推导特性,旨在简化代码并提升开发效率。类型推导使开发者无需显式指定变量的类型,从而让代码更具可读性和灵活性。本文深入探讨了C++11引入的auto
、decltype
和decltype(auto)
等关键特性,通过分析其背后的设计理念、实际应用场景,以及如何利用这些工具编写更简洁、健壮的代码。我们将结合具体代码示例,展示如何通过类型推导减少冗余、提升代码的可维护性,最后讨论这些特性对现代C++编程范式的深远影响。
引言
C++是一门强类型语言,要求开发者在编写代码时必须显式地声明变量类型。这一特性在早期C++版本中虽然保证了代码的严谨性,但却导致了某些场景下代码变得冗长,特别是在涉及模板编程和复杂类型时。为了简化开发者的工作,C++11引入了类型推导机制,其中最具代表性的就是auto
和decltype
关键字。通过自动推导变量的类型,C++程序员可以在不牺牲类型安全的情况下编写更简洁的代码。
本文将详细介绍C++类型推导的三个核心概念——auto
、decltype
、decltype(auto)
,探讨它们的应用场景、优缺点,并分析它们如何影响现代C++编程。
C++中的类型推导:动机与背景
在C++11之前,开发者需要显式声明所有变量的类型,这对于复杂类型,尤其是模板类型,显得尤为繁琐。例如,以下是一段使用标准库容器的C++代码:
std::vector<int>::iterator it = vec.begin();
这种类型声明在模板类型的嵌套中显得格外冗长和不直观。为了解决这个问题,C++11引入了auto
,让编译器负责推导变量的类型,从而简化代码的编写。
类型推导的核心思想是让编译器基于上下文信息推导出合适的类型,而不需要程序员手动指定。推导的主要目标是提升代码的可读性、减少冗余代码,同时保持C++语言的类型安全特性。
类型推导的优点
- 简化代码:消除冗长的类型声明,使代码更易读。
- 减少重复代码:编译器自动推导类型,减少重复性声明。
- 提高开发效率:降低了由于手动类型声明导致的错误几率,提升编程效率。
类型推导的缺点
- 类型不明确:由于类型推导的隐式性,某些情况下可能会降低代码的可读性。
- 调试复杂性增加:调试过程中,可能难以明确推导出的类型,增加了调试难度。
auto
:自动类型推导
auto
是C++11引入的一个关键字,允许编译器根据初始化表达式的类型来推导变量的类型。例如,下面的代码中,x
的类型将自动推导为int
:
auto x = 10;
auto
的工作机制
auto
会根据变量的初始化值来推导其类型。其推导机制遵循以下规则:
- 对于常规变量,
auto
推导出的类型是初始化表达式的类型。 - 对于指针或引用,
auto
推导出的类型会根据指向或引用的对象类型来确定。
例如:
int a = 5;
auto b = a; // b的类型为int
在指针和引用的场景中,auto
会根据初始化表达式的具体形式进行推导:
int x = 42;
int* p = &x;
auto y = p; // y的类型为int*
auto
中的类型修饰符
如果变量的初始化表达式中包含了类型修饰符,如const
或&
,则auto
的推导结果会有所不同。auto
默认会忽略掉顶层的const
修饰符,但会保留引用和底层const
。
const int a = 10;
auto b = a; // b的类型是int,而不是const int
为了保留引用或const
性质,可以在使用auto
时显式指定修饰符,例如:
const int a = 10;
auto& b = a; // b的类型是const int&
auto
的典型应用场景
auto
特别适用于模板编程和处理复杂类型的场景。在处理模板返回值或迭代器时,auto
可以显著简化代码。例如:
std::vector<int> vec = {1, 2, 3};
for(auto it = vec.begin(); it != vec.end(); ++it) {// do something
}
这种情况下,使用auto
避免了显式声明std::vector<int>::iterator
,使代码更加简洁。
decltype
:获取表达式的类型
decltype
是C++11中另一个重要的类型推导工具,它用于获取表达式的类型,而不是根据初始化表达式推导变量类型。与auto
不同,decltype
不需要初始化表达式,它可以直接获取任意表达式的类型。
例如:
int x = 10;
decltype(x) y = 20; // y的类型为int
decltype
的工作机制
decltype
的主要作用是推导出表达式的确切类型,包括引用和const
修饰符。其推导规则如下:
- 对于变量,
decltype
会推导出该变量的实际类型,包括引用和const
修饰符。 - 对于表达式,
decltype
推导出的类型会保留表达式的完整类型信息。
int a = 10;
int& ref = a;
decltype(ref) b = a; // b的类型为int&
在这种情况下,decltype
推导出了ref
的确切类型,包括引用。
decltype
的典型应用场景
decltype
常用于模板编程中推导复杂类型,特别是在需要返回某个表达式的类型时非常有用。例如,当函数返回类型取决于某个表达式的类型时,可以使用decltype
来推导返回类型:
template<typename T1, typename T2>
auto add(T1 a, T2 b) -> decltype(a + b) {return a + b;
}
在这个例子中,decltype(a + b)
用于推导add
函数的返回类型,确保返回类型与a + b
的类型一致。
decltype
与auto
的比较
虽然auto
和decltype
都是C++11中用于类型推导的工具,但它们有着不同的应用场景。auto
用于根据初始化表达式推导变量类型,而decltype
则是用于推导任意表达式的类型。auto
更适合简化代码,而decltype
则更适合模板编程和复杂类型推导。
decltype(auto)
:自动类型推导与decltype
的结合
C++14引入了decltype(auto)
,它结合了auto
和decltype
的优势,用于推导表达式的类型,并保留所有的类型信息(包括引用和const
修饰符)。这种特性使得decltype(auto)
非常适合用于返回类型的推导。
例如:
int x = 10;
decltype(auto) y = x; // y的类型为intint& ref = x;
decltype(auto) z = ref; // z的类型为int&
decltype(auto)
的应用场景
decltype(auto)
通常用于返回类型推导,特别是在需要返回表达式的确切类型(包括引用或const
)时。例如:
int x = 10;
int& foo() {return x;
}decltype(auto) bar() {return foo();
}
在这个例子中,bar
函数返回foo
的结果,decltype(auto)
保证了返回值的类型与foo
的返回类型一致。
类型推导的性能和可读性影响
虽然auto
、decltype
和decltype(auto)
能够简化代码,但它们在某些场景下可能会对性能和可读性产生一定影响。
性能影响
类型推导本身不会影响程序的运行效率,类型推导只是在编译期进行的。然而,开发者在使用类型推导时,需要特别注意类型推导的细节特别是在涉及到引用、指针以及常量等场景时,如果类型推导不够准确,可能会导致不必要的拷贝操作,从而影响性能。例如,auto
默认会移除顶层const
,并且不会自动推导出引用类型,这可能会导致意外的对象拷贝或临时对象的生成:
const int x = 42;
auto y = x; // y 是 int,x 中的 const 被移除了
在这种情况下,如果我们希望保留const
性质或者避免拷贝,可以通过显式使用引用来确保auto
推导出正确的类型:
const int x = 42;
auto& y = x; // y 是 const int&,避免了拷贝
类似的,在函数返回值场景中,如果误用了auto
而非decltype(auto)
,也可能导致对象拷贝:
int& foo() {static int x = 10;return x;
}auto bar() {return foo(); // 返回值类型为 int,而不是 int&,导致拷贝
}
在这个例子中,auto
推导出了foo()
返回的值类型为int
,而不是引用类型,导致了对象拷贝。正确的做法是使用decltype(auto)
来保持返回类型一致:
decltype(auto) bar() {return foo(); // 返回值类型为 int&
}
可读性影响
虽然类型推导简化了代码,但它也有可能降低代码的可读性,尤其是在复杂的模板编程中。由于编译器会在背后自动推导出类型,开发者在阅读代码时可能无法立即知道某个变量的具体类型,这可能会增加调试和维护的难度。
例如,下面的代码通过auto
简化了类型声明:
auto result = someComplexFunction();
然而,对于没有上下文的开发者来说,result
的具体类型可能难以立即判断,必须通过查看函数someComplexFunction()
的返回类型来确定。因此,在某些关键代码路径中,显式地声明类型可能会增加代码的可读性,避免隐式推导带来的困惑。
高效使用类型推导的最佳实践
尽管类型推导带来了许多便利,开发者仍然需要注意以下几点,以确保代码的清晰性和性能:
1. 合理使用auto
与decltype
在需要简化冗长的类型声明时,auto
是非常有效的工具。然而,开发者需要在合适的场景下使用auto
,避免滥用。在不确定类型推导结果时,可以使用decltype
来获取表达式的确切类型,从而确保推导出的类型符合预期。
例如:
std::vector<int> vec = {1, 2, 3};
auto it = vec.begin(); // 合适的使用
而在一些关键的函数签名中,最好显式声明类型以提高代码的可读性和明确性。
2. 使用decltype(auto)
来保持返回类型的精确性
当函数返回值涉及到复杂的引用或const
修饰符时,使用decltype(auto)
能够确保返回的类型与表达式的类型一致,避免不必要的拷贝或类型丢失。
int& foo() {static int x = 10;return x;
}decltype(auto) bar() {return foo(); // 保持返回值类型为 int&
}
3. 避免在简单场景下使用类型推导
对于非常简单的类型,显式声明类型通常更加清晰直观。例如,以下代码中,直接使用int
比使用auto
更能清楚表达变量的含义:
int x = 42; // 清晰明了
在这种简单情况下,使用auto
反而可能让代码显得过于复杂,降低可读性。
4. 在调试中验证类型推导
对于大型项目,尤其是涉及到复杂模板或库调用的代码,建议在调试过程中仔细检查auto
和decltype
推导出的类型是否与预期一致。这不仅可以避免潜在的运行时问题,也有助于提升代码的可维护性。
数学推导:类型推导的推理过程
C++的类型推导遵循一套严格的推导规则,编译器通过解析变量的初始化表达式来确定其类型。在这一过程中,C++编译器基于表达式的上下文信息应用一系列规则和算法来确定类型。我们可以通过形式化的推导过程来理解这一过程。
1. auto
类型推导规则
令表达式 E
为初始化表达式,T(E)
表示 E
的类型推导结果。
对于一般变量:
T ( E ) = type of E T(E) = \text{type of } E T(E)=type of E
对于指针或引用:
T ( E ) = { remove top-level const and volatile , if E is a reference or pointer keep reference or pointer , otherwise T(E) = \left\{ \begin{array}{lr} \text{remove top-level const and volatile}, & \text{if } E \text{ is a reference or pointer}\\ \text{keep reference or pointer}, & \text{otherwise} \end{array} \right. T(E)={remove top-level const and volatile,keep reference or pointer,if E is a reference or pointerotherwise
2. decltype
类型推导规则
对于表达式E
,decltype(E)
的推导规则是返回E
的类型,包括所有修饰符:
T ( E ) = type of E (with const/volatile and reference preserved) T(E) = \text{type of } E \text{ (with const/volatile and reference preserved)} T(E)=type of E (with const/volatile and reference preserved)
对于复杂表达式a + b
,decltype(a + b)
的类型推导遵循与表达式类型一致的原则,即保留a
与b
的类型特性。
类型推导在现代C++中的影响
类型推导的引入极大地改变了C++的编程范式,使得C++语言在保持类型安全的前提下变得更加灵活和高效。通过auto
、decltype
和decltype(auto)
,开发者可以专注于算法和逻辑,而不必为复杂的类型声明所困扰。
- 代码简化:减少了重复的类型声明,使得代码更加简洁明了,特别是在涉及模板编程的场景中,类型推导使得复杂的模板代码变得更具可读性。
- 提高生产效率:减少了显式类型声明的负担,开发者能够更快速地进行代码编写,专注于核心逻辑而不是类型管理。
- 增强代码的可维护性:通过自动推导类型,避免了手动指定类型可能导致的错误,特别是在进行代码重构时,类型推导能够减少代码中的错误。
对未来C++编程的启示
类型推导不仅是为了简化代码,它还为未来的C++编程提供了新的思路。随着C++语言的发展,类型推导机制可能会进一步扩展,以适应更多复杂的编程需求。结合现代C++的其他特性,如lambda表达式、范围for循环等,类型推导正在引领C++进入一个更高效、更易维护的时代。
结论
C++11引入的类型推导特性为开发者提供了极大的便利,使得代码更加简洁、可维护,同时仍保持了C++语言的类型安全性。通过auto
、decltype
和decltype(auto)
,开发者可以有效地处理复杂类型,避免冗长的类型声明,从而提高编程效率。尽管类型推导带来了许多好处,开发者仍需在使用时保持谨慎,避免滥用带来的代码可读性问题。
C++类型推导的引入不仅代表着语法的简化,更重要的是,它为开发者提供了一种新的编程思维方式:让编译器承担更多的类型推导工作,开发者则能够更加专注于逻辑和算法。这一理念推动了现代C++的发展,并将在未来继续影响C++编程的方向。
相关文章:
【C++】深入理解C++中的类型推导:从auto到decltype的应用与实践
C11引入了类型推导特性,旨在简化代码并提升开发效率。类型推导使开发者无需显式指定变量的类型,从而让代码更具可读性和灵活性。本文深入探讨了C11引入的auto、decltype和decltype(auto)等关键特性,通过分析其背后的设计理念、实际应用场景&a…...
使用Prometheus对微服务性能自定义指标监控
背景 随着云计算和容器化技术的不断发展,微服务架构逐渐成为现代软件开发的主流趋势。微服务架构将大型应用程序拆分成多个小型、独立的服务,每个服务都可以独立开发、部署和扩展。这种架构模式提高了系统的可伸缩性、灵活性和可靠性,但同时…...
深入解析 Lombok 的实现原理:以 @Builder 为例的实战演示(三)
文章目录 Lombok 的实现原理概述以 Builder 为例:解析 Lombok 如何生成 Builder 模式示例代码:没有 Lombok 的 Builder 模式使用 Lombok 的 Builder 简化代码 Lombok 如何实现 Builder:源码解析案例演示:自定义构造逻辑Lombok 的代…...
SEO基础:什么是SERP?【百度SEO专家】
SEO基础:什么是SERP? 大家好,我是林汉文(百度SEO专家),在进行SEO(搜索引擎优化)时,理解SERP是一个非常重要的基础概念。那么,究竟什么是SERP呢?本…...
HTML5教程(一)- 网页与开发工具
1. 什么是网页 网页 基于浏览器阅读的应用程序,是数据(文本、图像、视频、声音、链接等)展示的载体常见的是以 .html 或 .htm 结尾的文件 网站 使用 HTML 等制作的用于展示特定内容相关的网页集合。 2. 网页的组成 浏览器 代替用户向服务…...
Java进阶篇设计模式之二 ----- 工厂模式
前言 在上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法。本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式、工厂方法和抽象工厂模式。 简单工厂模式 简单工厂模式是属于创建型模式,又叫做静态工厂方法模式。…...
考研篇——数据结构王道3.2.2_队列的顺序实现
目录 1.实现方式说明2.代码实现2.12.1.1 代码12.1.2 代码22.1.3 代码3 2.22.2.1 代码42.2.5 代码52.2.6 代码6 总结 1.实现方式说明 多在选择题中考察 队尾指针(rear)有两种指向方式: 队尾指针指向队尾元素的位置,队尾指针指向…...
从零开始理解 Trie 树:高效字符串存储与查找的利器【自动补全、拼写检查】
题目分析 这道题让我们实现一个 Trie 类(也称为前缀树),以便高效地插入和查询字符串。前缀树是一种特殊的树形数据结构,适用于快速存储和检索字符串数据集中的键,比如实现 自动补全 和 拼写检查。 题目要求 Trie 类…...
关于sse、websocket与流式渲染
一、SSE是什么? 网络中的 SSE (Server-Sent Events) 是一种服务器向浏览器单向推送数据的机制,常用于需要实时更新的数据传输,如新闻推送、股票行情、聊天应用等。 SSE 的特点: 单向通信:服务器向客户端推送数据&…...
Python 语法与数据类型详解
Python 语法与数据类型详解 Python 以其简洁易读的语法和丰富多样的数据类型在编程领域占据重要地位。深入理解 Python 的语法和数据类型是掌握这门语言的关键。 一、Python 语法概述 (一)缩进规则 Python 独特的缩进规则是其语法的重要特征之一。与…...
LeetCode题练习与总结:扁平化嵌套列表迭代器--341
一、题目描述 给你一个嵌套的整数列表 nestedList 。每个元素要么是一个整数,要么是一个列表;该列表的元素也可能是整数或者是其他列表。请你实现一个迭代器将其扁平化,使之能够遍历这个列表中的所有整数。 实现扁平迭代器类 NestedIterato…...
51单片机快速入门之 AD(模数) DA(数模) 转换 2024/10/25
51单片机快速入门之 AD(模数) DA(数模) 转换 2024/10/25 声明:本文图片来源于网络 A模拟信号特点: 电压或者电流 缓慢上升 随着时间连续缓慢上升或下降 D数字信号特点:电压或者电流 保持一段时间的高/低电平 状态 / 突变 (高电压瞬间低电压) 数字电路中 通常将0-1v电压称…...
Typora 、 Minio and PicGo 图床搭建
流程介绍 本地安装Typora笔记工具拥有一台装有docker的服务器配置minio云图床管理控制页面下载PicGo上传工具服务器Docker环境搭建—Ubuntu系统 删除旧docker的所有依赖(非root用户) # 删除docker及安装时自动安装的所有包 sudo apt-get autoremove docker docker-ce docker…...
【计网】UDP Echo Server与Client实战:从零开始构建简单通信回显程序
目录 前言: 1.实现udpserver类 1.1.创建udp socket 套接字 --- 必须要做的 socket()讲解 代码实现:编辑 代码讲解: 1.2.填充sockaddr_in结构 代码实现: 代码解析: 1.3.bind sockfd和…...
微服务网关Zuul
一、Zuul简介 Zuul是Netflix开源的微服务网关,包含对请求的路由和过滤两个主要功能。 1)路由功能:负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。 2)过滤功能:负责对请求的过程…...
BuildCTF线上赛WP
Build::CTF flag不到啊战队--WP 萌新战队,还请多多指教~ 目录 Build::CTF flag不到啊战队--WP Web ez!http find-the-id Pwn 我要成为沙威玛传奇 Misc what is this? 一念愚即般若绝,一念智即般若生 别真给我开盒了哥 四妹,你听…...
《使用Gin框架构建分布式应用》阅读笔记:p143-p207
《用Gin框架构建分布式应用》学习第10天,p143-p207总结,总计65页。 一、技术总结 1.auth0 本人实际工作中未遇到过,mark一下,参考:https://auth0.com/。 2.使用template (1)c.File() (2)router.Static() (3)rou…...
华为网络管理配置实例
目录 组网需求 数据规划 配置思路 操作步骤 结果验证 配置脚本 管理员可以通过eSight网管系统对FW进行监控和管理,接收FW的告警。 组网需求 如图1所示,某企业在网络边界处部署了FW作为安全网关,并部署了eSight网管系统对网络设备进行集中…...
大语言模型数据处理方法(基于llama模型)
文章目录 前言一、基于huggingface的DataCollatorForSeq2Seq方法解读1、DataCollatorForSeq2Seq方法2、batch最长序列填充3、指定长度填充二、构建大语言模型数据加工模块1、数据读取2、数据加工1、数据格式2、预训练(pretrain)数据加工3、微调(sft)数据加工①、sft数据加工…...
爱奇艺大数据多 AZ 统一调度架构
01# 导语 爱奇艺大数据技术广泛应用于运营决策、用户增长、广告分发、视频推荐、搜索、会员营销等场景,为公司的业务增长和用户体验提供了重要的数据驱动引擎。 多年来,随着公司业务的发展,爱奇艺大数据平台已积累了海量数据,这…...
【C++篇】栈的层叠与队列的流动:在 STL 的韵律中探寻数据结构的优雅之舞
文章目录 C 栈与队列详解:基础与进阶应用前言第一章:栈的介绍与使用1.1 栈的介绍1.2 栈的使用1.2.1 最小栈1.2.2 示例与输出 1.3 栈的模拟实现 第二章:队列的介绍与使用2.1 队列的介绍2.2 队列的使用2.2.1 示例与输出 2.3 队列的模拟实现2.3.…...
使用 Flask 实现简单的登录注册功能
目录 1. 引言 2. 环境准备 3. 数据库设置 4. Flask 应用基本配置 5. 实现用户注册 6. 实现用户登录 7. 路由配置 8. 创建前端页面 9. 结论 1. 引言 在这篇文章中,我们将使用 Flask 框架创建一个简单的登录和注册系统。Flask 是一个轻量级的 Python Web 框架…...
计算机毕业设计Python+大模型微博情感分析 微博舆情预测 微博爬虫 微博大数据 舆情分析系统 大数据毕业设计 NLP文本分类 机器学习 深度学习 AI
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 《Python大模型微博情感分析…...
CTF--Misc题型小结
(萌新笔记,多多关照,不足之处请及时提出。) 不定时更新~ 目录 密码学相关 文件类型判断 file命令 文件头类型 strings读取 隐写术 尺寸修改 文件头等缺失 EXIF隐写 thumbnail 隐写 文件分离&提取 binwalk foremo…...
深度学习系列——RNN/LSTM/GRU,seq2seq/attention机制
1、RNN/LSTM/GRU可参考: https://zhuanlan.zhihu.com/p/636756912 (1)对于这里面RNN的表示中,使用了输入x和h的拼接描述,其他公式中也是如此 (2)各符号图含义如下 2、关于RNN细节,…...
通过call指令来学习指令摘要表的细节
E8 cw cw 表示E8后面跟随2 字节 (什么数不知道) rel16 指在与指令同一代码段内的相对地址偏移 D ,指向Instruction Operand Encoding 表中的D列, 他告诉我们 操作数1 是一个0FFSET N.S. 在64位模式下,某些指令需要使用“地址覆盖前缀”(address over…...
10分钟使用Strapi(无头CMS)生成基于Node.js的API接口,告别繁琐开发,保姆级教程,持续更新中。
一、什么是Strapi? Strapi 是一个开源的无头(headless) CMS,开发者可以自由选择他们喜欢的开发工具和框架,内容编辑人员使用自有的应用程序来管理和分发他们的内容。得益于插件系统,Strapi 是一个灵活的 C…...
创建插件 DLL 项目
Step 1: 创建插件 DLL 项目 在 Visual Studio 中创建一个新的 DLL 项目,并添加以下文件和代码。 头文件:CShapeBase.h cpp 复制代码 #pragma once #include <afxwin.h> // MFC 必需头文件 #include <string> #include <vector> #i…...
OpenCV双目相机外参标定C++
基于OpenCV库实现双目测量系统外参标定过程。通过分析双目测量系统左右相机拍摄的棋盘格标定板图像,包括角点检测、立体标定、立体校正和畸变校正的步骤,获取左右相机的相对位置关系和姿态。 a.检测每张图像中的棋盘格角点,并进行亚像素级精…...
【GESP】C++一级练习BCQM3055,4位数间隔输出
一级知识点取余、整除运算和格式化输出知识点应用。其实也可以用string去处理,那就属于GESP三级的知识点范畴了,孩子暂未涉及。 题目题解详见:https://www.coderli.com/gesp-1-bcqm3055/ https://www.coderli.com/gesp-1-bcqm3055/https://w…...
微信公众号封面制作网站/适合小学生的新闻事件
转载于:https://blog.51cto.com/maclean/1278815...
做网站上是外部连接怎么改/qq群排名优化
docker容器中的环境变量 docker可以为容器配置环境变量。配置的途径有两种: 在制作镜像时,通过ENV命令为镜像增加环境变量。在容器启动时使用该环境变量。在容器启动时候,通过参数配置环境变量,如果与镜像中有重复的环境变量&…...
自己怎么做免费网站空间/市场推广计划方案模板
前两天有时开机蓝屏,提示tcpip.sys文件怎么怎么样,我就把c:\windows\system32\drivers下面的tcpip.sys文件删除,从安装光盘的I386文件夹下提取新的文件到这个文件夹下,谁知今天来了,开机后:先是虚拟机的VMNET报错,然后我上Q,不行,打开OUTLOOK,不行,赶紧PING下服务器,不行,PING …...
网站关键词排名优化推广软件/西安网站建设方案优化
PMP考试难吗? 如果我说"只要好好看书就不难"这样的唯心之论,大家肯定会觉得我站着说话不腰疼。 但客观而言,考试的难度并不大,因为全部都是选择题,不需要大段大段地背诵答题模板,相比于国内的考…...
web网站性能测试怎么做/网站推广联盟
什么是ORM?就是对象关系映射(Object Relational Mapping,简称ORM)模式,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的一种技术。 我们在开发项目的时候,是不是总要建立实体类(Modlue Class)?例如下面是…...
企业网站代码/武汉网络推广优化
一、所需环境 1,JDK 2,HADOOP 4,mysql 3,HIVE 二、安装azkaban 1,安装git命令: yum install git 2,下载azkaban源码:git clone https://github.com/azkaban/azkaban.git 3,安装到 azkaban-tar目录下 4,更改配置文件&am…...