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

110 C++ decltype含义,decltype 主要用途

一,decltype 含义和举例

decltype有啥返回啥,auto则不一样,auto可能会舍弃一些东西。

decltype 是 C++11提出的说明符。主要作用是:返回操作数的数据类型。  

decltype 是用来推导类型,decltype对于一个给定的 变量名或者表达式,能推导出类型

这和auto 有啥区别呢?

auto a =10; 我们用10这个表达式 赋值给 a,那么auto 就能推断出来 a 是int,auto本身也是auto。也就是说,auto 必须初始化 获得这个值,才能知道具体的类型。

现在我们并不希望使用一个具体的值或者表达式 来对a进行初始化,那么怎么知道a 的类型呢?

decltype 就派上用场了。

decltype 特点:

        1.decltype 的自动类型推断会发生在编译器(和auto 一样)

        2.decltype 不会真正计算表达式的值。

decltype 后的圆括号中是个变量

        const int i =0;

        const int &iy = i;

        auto j1 = i; //auto 的传值方式,i 的引用属性和const属性都会被抛弃。j1 = int, auto = int 

        decltype(i) j2 = 15; //如果decltype 中是一个变量,则变量中的const 属性会保留, j2 = const int

        decltype(iy) j3 = j2;//如果decltype中是一个变量,则变量中的const属性,引用属性,都会保留,因此 j3 = const int &

        decltype 是很循规蹈矩的,有啥就返回啥。

class Teacher{

public:

int i ;

}

decltype(Teacher::i) a;//会推导出 a = int

Teacher tea;

decltype(tea) tea2;// 会推导出 tea2 = Teacher

decltype(tea.i)  mv_i;//会推导出 mv_i的类型是 int

int x =1;y=2;

auto &&z = x; // z 是万能引用,那么先要看x 是啥,x 是左值,万能引用并不是一种真正的类型,万能引用要不是左值引用,要不是右值引用, 万能引用只是一个概念,因此z 是一个 左值引用 int &, auto也是一个int &

auto &&zz = 100; // z 是万能引用,那么先要看后面传进来的值是啥,是100,100是个右值,因此zz就是 右值引用 int &&, auto 是一个int。

decltype(z) && h = y; //z是一个万能引用,其本质是一个左值引用,因此 h = & && ,引用折叠发挥作用,因此h 是一个 左值引用

decltype(z) & h1 = y; //z是一个万能引用,其本质是一个左值引用,因此 h1= & & ,引用折叠发挥作用(只要有一个是左值引用,就是左值引用),因此h1 是一个 左值引用。

decltype(zz) && h2 = 100;//zz是一个万能引用,其本质是一个右值引用,因此 h2 = && &&,引用折叠发挥作用,(两个都必须是右值引用,才是右值引用),因此h2是右值引用,注意的是给如果写成 decltype(zz) && h2 = y; 就会有build error,这是因为h2是右值引用,只能绑定右值,但是y是左值。

例子:

void main() {//decltype 知识点//decltype 是 C++11提出的说明符。主要作用是:返回操作数的数据类型。  //1 decltype 括号里面是一个变量int a = 10; //普通int *pa = &a;//指针int &yinyonga = a;//左值引用decltype(a) b;using boost::typeindex::type_id_with_cvr;cout << "b = " << type_id_with_cvr<decltype(b)>().pretty_name() << endl; //结果是intdecltype(pa) b1;cout << "b1 = " << type_id_with_cvr<decltype(b1)>().pretty_name() << endl; //结果是int *int c = 30;double d = 80.8;decltype(yinyonga) b2 = c; //很显然b2是一个左值引用,左值引用必须绑定左值cout << "b2 = " << type_id_with_cvr<decltype(b2)>().pretty_name() << endl; //结果是int &//decltype(yinyonga) b3 = d; //build error, b3 是 int&,是需要绑定在一个int 的左值上的,d是double类型的左值,因此有build error//cout << "b3 = " << type_id_with_cvr<decltype(b3)>().pretty_name() << endl; //结果是int &decltype(a) *wnyy1;cout << "wnyy1 = " << type_id_with_cvr<decltype(wnyy1)>().pretty_name() << endl; //decltype 会将a变成 int,因此 wnyy1是int *decltype(pa) *wnyy2;cout << "wnyy2 = " << type_id_with_cvr<decltype(wnyy2)>().pretty_name() << endl;//decltype 会将pa变成 int *,因此 wnyy2是int **//decltype(yinyonga) *wnyy3;//不允许使用指向 引用的指针int a1 = 80909;decltype(a) &wnyy4 = a1;cout << "wnyy4 = " << type_id_with_cvr<decltype(wnyy4)>().pretty_name() << endl;//decltype 会将a变成 int ,因此 wnyy4是int &decltype(pa) &wnyy5 = pa;cout << "wnyy5 = " << type_id_with_cvr<decltype(wnyy5)>().pretty_name() << endl;//decltype 会将pa变成 int * ,因此 wnyy5是int *&int &yingyonga2 = a;decltype(yinyonga) &wnyy6 = yingyonga2;cout << "wnyy6 = " << type_id_with_cvr<decltype(wnyy6)>().pretty_name() << endl;//decltype 会将yinyonga变成 int&  ,按照引用折叠规则,因此 wnyy6是int &int && youzhiyinyonga = 231;decltype(youzhiyinyonga) &wnyy7 = yingyonga2;cout << "wnyy7 = " << type_id_with_cvr<decltype(wnyy7)>().pretty_name() << endl;//decltype 会将youzhiyinyonga变成 int&&  ,按照引用折叠规则,因此 wnyy7是int &decltype(youzhiyinyonga) &&wnyy8  = 90;cout << "wnyy8 = " << type_id_with_cvr<decltype(wnyy8)>().pretty_name() << endl;//decltype 会将youzhiyinyonga变成 int&&  ,按照引用折叠规则,因此 wnyy8是int &&decltype(yingyonga2) && wnyy9 = yinyonga;cout << "wnyy9 = " << type_id_with_cvr<decltype(wnyy9)>().pretty_name() << endl;//decltype 会将yingyonga2变成 int&  ,按照引用折叠规则,因此 wnyy9是int &}

decltype 后的圆括号中非变量(是表达式)

decltype 会返回 表达式的 结果类型。

decltype(8) kkk = 5;//decltype是计算 表达式8的结果类型,也就是 int,因此KKK是int

decltype(8.0) kkk1 = 5;//decltype是计算 表达式8.0的结果类型,也就是 float,因此KKK是float

void main() {//decltype 后的圆括号中非变量(是表达式)decltype(8) kkk = 5;//decltype是计算 表达式8的结果类型,也就是 int,因此KKK是intdecltype(8.0) kkk1 = 5;//decltype是计算 表达式8.0的结果类型,也就是 float,因此KKK是floatusing boost::typeindex::type_id_with_cvr;cout << "kkk = " << type_id_with_cvr<decltype(kkk)>().pretty_name() << endl; //结果是intcout << "kkk1 = " << type_id_with_cvr<decltype(kkk1)>().pretty_name() << endl; //结果是intint a = 10;int *pa = &a;int &yinyonga = a;decltype(a + 10) kkk2 = 5;cout << "kkk2 = " << type_id_with_cvr<decltype(kkk2)>().pretty_name() << endl; //结果是int//kkk2是 int ,由于 a+10这个表达式的结果是int,因此kkk2是intdecltype(pa + 10) kkk3 ;cout << "kkk3 = " << type_id_with_cvr<decltype(kkk3)>().pretty_name() << endl; //结果是int//kkk3是 int* ,由于 pa+10这个表达式的结果是int *,因此kkk3是int *//decltype(*pa) kkk4 = 88;//会有build errorint b = 800;decltype(*pa) kkk5 = b;//注意这里,会有不同cout << "kkk5 = " << type_id_with_cvr<decltype(kkk5)>().pretty_name() << endl; //结果是int//kkk5是 int& ,//*pa 是指针pa所指向的对象,而且能够给对象赋值,类似 *pa = 800;因此 *pa 是一个左值,// *pa除了在定义变量的时候,其他时间都是一个表达式。// 注意这句话:如果表达式结果能够作为赋值语句左边的值,那么decltype后返回的就是引用//这也是为啥 kkk4 赋值=80的时候,会有build error,因为是int &,需要一个左值,而80是个右值//这种情况要专门记一下。//整理为:如果decltype后面是一个非变量的表达式,并且表达式能够作为等号左边内容,那么他返回的类型必定一个左值引用decltype(yinyonga + 10) kkk6;cout << "kkk6 = " << type_id_with_cvr<decltype(kkk6)>().pretty_name() << endl; //结果是int//kkk6是 int ,由于 yinyonga+10这个表达式的结果是int ,因此kkk6是int decltype(a) kkk7;cout << "kkk7 = " << type_id_with_cvr<decltype(kkk7)>().pretty_name() << endl; //结果是int//kkk7是 int ,由于 a是一个变量 ,a是int ,因此kkk7是int decltype((a)) kkk8 = b;cout << "kkk8 = " << type_id_with_cvr<decltype(kkk8)>().pretty_name() << endl; //结果是int//kkk8是 int &,由于  (a)是一个表达式,注意这里a是变量,(a)是表达式 ,且(a) = 90,是可以赋值的,因此kkk8是int &}

decltype后的圆括号是个函数

    //decltype后的圆括号是个函数,那么decltype()括号中的类型为该函数返回类型,但是不会真正的去执行函数,它只会看函数的返回值

void main() {//decltype后的圆括号是个函数,那么decltype()括号中的类型为该函数返回类型,但是不会真正的去执行函数,它只会看函数的返回值decltype(func62()) a = 90;using boost::typeindex::type_id_with_cvr;cout << "a = " << type_id_with_cvr<decltype(a)>().pretty_name() << endl; //结果是int// a的类型是intdecltype(func63(89,90.8)) b = 90000;cout << "b = " << type_id_with_cvr<decltype(b)>().pretty_name() << endl; //结果是int// b的类型是doubledecltype(func63) c;cout << "c= " << type_id_with_cvr<decltype(c)>().pretty_name() << endl; //结果是int// c的类型是: double __cdecl(int,double) 有返回值,有参数,是一个可调用对象,注意不是 函数指针//如果是函数指针,应该是 double (*)(int,double)//如果是函数引用 ,应该是 double (&)(int,double)//c的类型是可调用对象,c不是类型//需要使用function 类模版来处理function<decltype(func63)>  cc2 = func63;function<decltype(func63)>  cc3 = func64;//function<c>  cc2 = func63;//build error,c是可调用对象,不是类型cc2(20, 98.8);cc3(98.9,30);
}

二 decltype 主要用途

主要是用于模版编程中。

1.在类模版中应付可变类型

//decltype 主要用途1:在类模版中 应付可变类型。template <class T>
class Teacher60 {
public:typename T::iterator iter;//typename在这里类似重命名,告知 void getbegin(T & tmpc) {//...iter = tmpc.begin();//...}
};//类模版偏特化
template <class T>
class Teacher60<const T>{
public:typename T::const_iterator iter;// typename在这里的含义是:显式地告诉编译器,//T::const_iterator是一个类型名。//	然后用这 个类型  T::const_iterator 定义一个变量 iter void getbegin(const T & tmpc) {//...iter = tmpc.begin();//...}
};//使用decltype()方法处理,实参传递的是啥,我们就定义啥
template <class T>
class Teacher61{
public:decltype(T().begin()) iter;// 使用decltype()指定类型,//注意的是 T(),生成临时对象,调用临时对象的begin()函数//但是由于被 decltype 包裹,因此不会调用构造函数,也不会调用begin()函数,说白了,decltype()括号里面是函数,则只是会拿 函数的返回值类型,不会执行函数void getbegin(const T & tmpc) {//...iter = tmpc.begin();//...}
};void main() {// decltype主要用途1 ,应付可变类型,一般decltype主要用途还是应用于模版编程中using conttype = std::vector<int>;conttype myarr = { 10,20,30 };Teacher60<conttype> ct;ct.getbegin(myarr);//如果我们将 conttype改成 const std::vector<int>;就会有build error//原因是我们对于 const std::vector<int>,需要使用typename T::const_iterator iter 处理using conttype1 = const std::vector<int>;conttype myarr1 = { 10,20,30 };Teacher60<conttype1> ct1;ct1.getbegin(myarr1);//那么对于这种问题,在C++98时代,需要通过 类模版特例化来实现。
//https://mp.csdn.net/mp_blog/creation/success/135431592//在C++11时代,可以通过 decltype 来声明类型,这样就避免了使用类模版特例化处理这些问题using conttype2 = const std::vector<int>;conttype myarr2 = { 10,20,30 };Teacher61<conttype2> ct2;ct2.getbegin(myarr2);}

2.通过变量表达式抽取变量类型

//decltype 主要用途2,通过变量表达式 抽取 变量类型。void main() {vector<int> ac;ac.push_back(1);ac.push_back(2);vector<int>::size_type vsize = ac.size(); //size_type 无符号整数类型(通常是 std::size_t )decltype(ac) bc;//bc 的类型是vector<int>using boost::typeindex::type_id_with_cvr;cout << "bc = " << type_id_with_cvr<decltype(bc)>().pretty_name() << endl; //结果是int//bc = class std::vector<int, class std::allocator<int> >decltype(ac)::iterator iter;decltype(ac)::size_type vvsize = ac.size();cout << "vvsize = " <<vvsize << endl;}

3.auto 结合 decltype 构成返回 类型后置 语法

//3.auto 结合 decltype 构成返回 类型后置 语法
//先回顾一下之前学的 auto 返回类型后置语法auto func70(int a, double b) ->int {//auto 在这里表示的是  函数返回类型是写在->之后的。return 0;
}
//使用decltype 自动推导。a+b的返回值类型是double,因此 auto 是double
auto func71(int a, double b)->decltype(a + b) {return a * a + b;
}//对于同名函数的处理问题int func72(int & temp) {cout << "func72(int & temp)" << endl;return temp + 2;
}double func72(double & temp) {cout << "func72(double & temp)" << endl;return temp + 2.80;
}template <typename T>
auto Func73(T & temp)->decltype(func72(temp)) {return func72(temp);
}void main() {int i = 90;Func73(i);double d = 90.8;Func73(d);
}

4.decltype(auto)用法 C++14提出

问题:

                用于函数返回类型

decltype(auto):把auto 理解成要推导的类型,推导过程我们采用decltype

//decltype(auto)一起使用
//先看问题template <typename T>
T& func80(T& v1) {v1 = v1 * 2;return v1;
}template <typename T>
auto& func81(T& v1) {v1 = v1 * 2;return v1;
}template <typename T>
auto func82(T& v1) {v1 = v1 * 3;return v1;
}//decltype(auto) 会让返回值是啥类型(v1是 T&),那么整个函数的返回值也就是 T&
template <typename T>
decltype(auto) func83(T& v1) {v1 = v1 * 4;return v1;
}void main() {int a = 100;func80<int>(a) = 90000;//func80的返回值是 T&,是个左值,因此赋值,由于func80返回的就是a的引用,因此相当于给a赋值90000cout << "a = " << a << endl;//下来,我们将func80 返回值auto &int b = 80;func81<int>(b) = 190000;//func80的返回值是 T&,是个左值,因此赋值,由于func80返回的就是a的引用,因此相当于给a赋值90000cout << "b = " << b << endl;//下来,我们将func80 返回值auto int c = 80;//func82<int>(c) = 190000;//build error, 因为auto 返回的类型是intcout << "c = " << c << endl;int d = 180;func83<int>(d) = 8190000;//使用 decltype(auto)做为返回值cout << "d = " << d << endl;}

                用于变量声明中

	int x = 90;const int &y = 80;auto z = y; //z的类型是int,因为是值传递,会丢弃 const 和引用decltype(auto) z1 = y;//z1的类型为const int &

5.再谈 decltype ()中 是变量表达式的情况再讨论

decltype(auto) func85() {int a = 90;return a;
}decltype(auto) func86() {int aa = 90;return (aa);
}//坑点
void main() {//我们观察 func85 和 func86//由于func86的返回值 是用()小括号 包裹的,因此会被认为是一个表达式。因此func86的返回值是int&//这就有问题了,因为aa是局部变量,出了func86的范围就失效了}

三 总结

相关文章:

110 C++ decltype含义,decltype 主要用途

一&#xff0c;decltype 含义和举例 decltype有啥返回啥&#xff0c;auto则不一样&#xff0c;auto可能会舍弃一些东西。 decltype 是 C11提出的说明符。主要作用是&#xff1a;返回操作数的数据类型。 decltype 是用来推导类型&#xff0c;decltype对于一个给定的 变量名或…...

PYTHON 120道题目详解(85-87)

85.Python中如何使用enumerate()函数获取序列的索引和值&#xff1f; enumerate()函数是Python的内置函数&#xff0c;它可以将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列&#xff0c;同时列出数据和数据下标&#xff0c;一般用在for循环当中。 以下是一个…...

【Linux】Linux编译器-gcc/g++ Linux项目自动化构建工具-make/Makefile

目录 Linux编译器-gcc/g使用 1.背景知识 Linux中头文件的目录在 Linux 库 条件编译的典型应用 2.gcc如何完成 动态库 vs 静态库 debug && release Linux项目自动化构建工具-make/Makefile 背景 用法 特殊符号 Linux编译器-gcc/g使用 1.背景知识 预处理&am…...

sqlserver 子查询 =,in ,any,some,all的用法

在 SQL Server 中&#xff0c;子查询常用于嵌套在主查询中的子句中&#xff0c;以便根据子查询的结果集来过滤主查询的结果&#xff0c;或者作为主查询的一部分来计算结果。 以下是 、IN、ANY、SOME 和 ALL 运算符在子查询中的用法示例&#xff1a; 使用 运算符进行子查询&a…...

基于MapVGL的地理信息三维度数据增长可视化

写在前面 工作中接触&#xff0c;简单整理博文内容为 基于MapVGL的地理信息维度数据增长可视化 Demo理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都…...

天锐绿盾|防泄密系统|计算机文件数据\资料安全管理软件

“天锐绿盾”似乎是一款专注于防泄密和计算机文件数据/资料安全管理的软件。在信息安全日益受到重视的今天&#xff0c;这样的软件对于保护企业的核心数据资产和防止敏感信息泄露至关重要。 通用地址&#xff1a;www.drhchina.com 防泄密系统的主要功能通常包括&#xff1a; 文…...

leetcode刷题(罗马数字转数字)

1.题目描述 2.解题思路 这时候已经给出了字母对应的数字&#xff0c;我们只需要声明一个字典&#xff0c;将罗马数字和数字之间的对应关系声明即可。其中可能涉及到会出现两个连续的罗马字母代表一个数字&#xff0c;这时候我们需要判断遍历的字符和将要遍历的下一个字符是否存…...

什么是NAT网关?联通云NAT网关有什么优势

在当今云计算时代&#xff0c;网络安全和连接性是企业发展的关键因素之一。NAT网关&#xff08;Network Address Translation Gateway&#xff09;是一种网络设备&#xff0c;它可以在私有网络和公共网络之间进行地址转换&#xff0c;从而使得内部网络中的设备能够与外部网络进…...

CVE-2023-41892 漏洞复现

CVE-2023-41892 开题&#xff0c;是一个RCE Thanks for installing Craft CMS! You’re looking at the index.twig template file located in your templates/ folder. Once you’re ready to start building out your site’s front end, you can replace this with someth…...

【每日一题】06 排序链表

问题描述 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 求解 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* sortList(struct ListNode* head) {struct…...

【精品】关于枚举的高级用法

枚举父接口 public interface BaseEnum {Integer getCode();String getLabel();/*** 根据值获取枚举** param code* param clazz* return*/static <E extends Enum<E> & BaseEnum> E getEnumByCode(Integer code, Class<E> clazz) {Objects.requireNonN…...

Vue2学习第一天

Vue2 学习第一天 1. 什么是 vue? Vue 是一套用于构建用户界面的渐进式框架。 2. vue 历史 vue 是在 2013 年创建的&#xff0c;vue3 是 2020 出现的&#xff0c;现在主要是用 vue2&#xff0c;创新公司用的是 vue3 vue 的作者是尤雨溪&#xff0c;vue 的搜索热度比 react…...

HAL STM32通过multi_button库处理按键事件

HAL STM32通过multi_button库处理按键事件 &#x1f4cd;作者&#xff1a;0x1abin的multi_button库:https://github.com/0x1abin/MultiButton &#x1f4d8;MultiButton简介 MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块&#xff0c;可无限量扩展按键&#xff0c;…...

随机过程及应用学习笔记(一)概率论(概要)

概率是随机的基础&#xff0c;在【概率论&#xff08;概要&#xff09;】这个部分中仅记录学习随机过程及应用的基本定义和结果。 前言 首先&#xff0c;概率论研究的基础是概率空间。概率空间由一个样本空间和一个概率测度组成&#xff0c;样本空间包含了所有可能的结果&…...

洛谷_P1059 [NOIP2006 普及组] 明明的随机数_python写法

这道题的关键在于去重和排序&#xff0c;去重可以联想到集合&#xff0c;那排序直接使用sort方法。 n int(input()) data set(map(int,input().split( ))) data list(data) data.sort() print(len(data)) for i in data:print(i,end )...

爆火的人工智能开源open-interpreter源码解析

今天这篇文章带大家一起来阅读下github上爆火的开源项目 open-interpreter的源代码&#xff0c;相当于是一个可以本地部署的openai code-interpreter。 今天这期我们透过现象看本质&#xff0c;一起来剖析下他的源码。 体验open-interpreter的视频地址 open-interpreter&…...

POM设计模式思路,详解POM:概述与介绍,POM思路梳理+代码示例(全)

概述 在UI自动化测试中&#xff0c;POM模式是一种设计思路&#xff0c;它的核心思想是方法的封装。它将方法类和页面元素进行分离&#xff0c;增强了代码的可维护性。值得注意的是&#xff0c;这种分层的设计模式&#xff0c;最好也是从线性代码开始&#xff0c;逐步将代码进行…...

1、学习 Eureka 注册中心

学习 Eureka 注册中心 一、创建 Eureka 微服务0、SpringBoot 和 SpringCloud 版本1、引入 Eureka 服务端依赖2、启动类加 EnableEurekaServer 注解3、配置 yaml 文件&#xff0c;把 Eureka 服务注册到 Eureka 注册中心4、访问 Eureka 服务端&#xff0c;查看注册中心的服务列表…...

何为分账系统?

1、分账系统产生的背景 在数字化浪潮下第三方支付价值凸显&#xff0c;大大提升资金流与信息流流转效率&#xff0c;成为构建产业数字化重要枢纽。近年来&#xff0c;基于云计算、大数据、人工智能、物联网等技术积累&#xff0c;以第三方支付为切点的金融科技创新爆发着强大的…...

机器学习10-特征缩放

特征缩放的目的是确保不同特征的数值范围相近&#xff0c;使得模型在训练过程中更加稳定&#xff0c;加速模型收敛&#xff0c;提高模型性能。具体而言&#xff0c;零均值和单位方差的目标有以下几点好处&#xff1a; 1. 均值为零&#xff08;Zero Mean&#xff09;&#xff1a…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

Xcode 16 集成 cocoapods 报错

基于 Xcode 16 新建工程项目&#xff0c;集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...

接口 RESTful 中的超媒体:REST 架构的灵魂驱动

在 RESTful 架构中&#xff0c;** 超媒体&#xff08;Hypermedia&#xff09;** 是一个核心概念&#xff0c;它体现了 REST 的 “表述性状态转移&#xff08;Representational State Transfer&#xff09;” 的本质&#xff0c;也是区分 “真 RESTful API” 与 “伪 RESTful AP…...

OpenHarmony标准系统-HDF框架之I2C驱动开发

文章目录 引言I2C基础知识概念和特性协议&#xff0c;四种信号组合 I2C调试手段硬件软件 HDF框架下的I2C设备驱动案例描述驱动Dispatch驱动读写 总结 引言 I2C基础知识 概念和特性 集成电路总线&#xff0c;由串网12C(1C、12C、Inter-Integrated Circuit BUS)行数据线SDA和串…...

分享今天做的力扣SQL题

其实做之前就打算分享的&#xff0c;但是做完又不想分享了。。。结果没几分钟&#xff0c;还是&#xff0c;写一下吧。我就当各位是监督我的。 说一下&#xff0c;这是第一天做SQL题&#xff0c;虽然我也是软件工程专业&#xff0c;但是学的本来就不好&#xff0c;又忘了个差不…...