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

Unity常见面试题详解(持续更新...)


 一丶声明、定义、实例化、初始化

1、首先我们来讨论在C/C++中的声明和定义..

1)我们先从函数声明和定义说起...

一般我们在C++里都会先定义一个函数,然后再Main函数前将函数声明,比如:

//函数声明
int Add(int);int Main
{}
//函数定义
int Add(int)
{
}

声明就是告诉编译器,咱这儿有一个名字叫Add,返回值和参数需要int的函数,就给你说一声

定义就是在内存中拓展出了这么一片空间给该函数分配内存

所以你看,定义只能定义一次吧,如果你稍微变了个啥,这函数就不是自己了,但是声明你随意,你想声明啥声明啥,我内存没有啊,也就不存在调用,就相当于你在那空喊,没人理你...

2)我们再来讨论变量的声明和定义...

在C++里面,我们是这么声明和定义的

//声明
extren int var;
typeof int INT;
struct Node;//定义
extern int ble = 10;

所以声明是不开辟内存空间的,而定义必须占用内存空间...

因此,在C++中,常用到定义和声明的就是函数和变量。。。

3)实例化和初始化

在面向对象的编程中,通常把用类创建对象的过程成为实例化,注意,他一般用在类上

初始化可以理解为给声明的对象赋值的过程,也就相当于定义

2:C#中的定义和声明

        在C#中,其实和C++大概一样的,不过在C#中,你定义一个函数以后,可以直接进行使用,而不用在主函数体上方声明函数,至于变量的定义和声明,和C++一样,如果是int a ;只是声明,没有定义,使用int  a = 10;这样才算创建出来了变量。


二、委托和事件

一:委托

        我说的这一点很重要,所有的代码语言创造者母语都是英语,我们从英语翻译到中文的过程中难免会存在一些不太能还原本意的词,比如我之前一直不理解构造函数和析构函数,只知道这俩货作用相反,直到我看到了它的英文意思,Construstor/Distructor,我才彻底理解了他们的作用。

        接下来我们来看委托,Delegate,来看两个例句,深入理解Delegate...

Can you delegate some tasks or projects?                                你能够分配一些任务或者项目吗?

So why not delegate more work to your employees?    所以你为啥不给你的员工多分分配点任务?

从上面的句子中我们可以看到,他就是分配,也就是委托的意思(但是感觉可能有些人对委托的理解不如分配来的直接,至少对我来说是这样)

微软官方的解释是委托可以获取一个或多个方法,但是类型和返回值必须和方法相同,可以理解成委托是方法的抽象,也就是说定义一个方法的模板,至于这个方法具体是怎么样的,就由方法自己去实现。这点和函数指针很像...后续写单播委托时候再添加这部分内容。

话不多说,看代码...

1:单播委托——一次只能装进去一个方法

Public delegate 返回值 MyDelegate(参数1,参数2)

就这么一步,我们就把委托定义出来了,接下来要做的就是把这玩意儿实例化出来,那我们怎么把我们的方法给委托呢?

第一点就是我们需要有和定义的委托类型一致的返回值和参数列表

这点比较像C语言函数指针,我们用函数指针来说明上一个问题

//使用Typedef将该函数指针声明为一种类型,它是指向两个参数为int,返回值为int的函数指针
typedef int (*Calculator)(int x , int y);int Add(int a ,int b)
{return a+b;
}int Multiply(int a ,int b)
{return a*b;
}//函数指针的使用Calculator Pointer1 = &Add;
Calculator Pointer2 = &Multiply;//这样我们在调用函数的时候就不再写函数,而是采用函数指针的方法,间接的指向了该类型的函数
Pointer1(0,1);
Pointer2(1,2);

从上面的函数指针我们可以看出,我们在注册方法的时候,可以间接的声明一个和该方法类型和返回值都一致的指针类型,从而调用函数指针即可,那么我们的委托和它是类似的....

接下来看我们的委托的实例化和方法的插入,可以使用new,也可以直接引用方法:

//实例化委托
MyDelegate myDelegate = new MyDelegate(Function);//简化写法
myDelegate = Telegate;返回值类型 Function(参数1,参数2)
{方法体;
}

委托的调用,可以使用Invoke,也可以直接写委托名+()

可以通过Invoke进行调用委托
myDelegate.Invoke();也可以直接myDelegate();

2:多播委托——一次装多个方法,但不安全

在上面的方法添加环节,我们只需要做小小的修改

myDelegate += ChangeColor;
myDelegate += Log;

但是其实我们没事儿也不会这么干,这样长期下来有可能会存在内存泄漏,如果顺序执行列表中方法有一个出错了,后面的就都不会执行了,所以我们还有其他更好的选择

3:Action委托和Func委托

大多数的情况下,我们不太需要自己去声明委托,而是使用现成的委托即可,C#为我们内置了两种泛型委托

1)Action委托——返回值必须为空,参数可有可无

//声明无参数的Action委托
Action action;//声明有参数的Action委托
Action<string,float> action1;//Action的使用
action = new Action(同参数的方法1)
action1 = new Action<string ,float> (sayhello);//sayhello方法
public void SayHello(string name,float num)
{Debug.log(sting.Fromat("{0} has {1} ChampionShips .",name,num));
}

2) Func委托——返回值必须有,但是参数可有可无

//声明Func委托,前面是参数,后面是返回值
Func<double,double,double> func1;//使用
func1 = new Func<double,double,double>(Add);//跟Func结构一样的方法
public double Add(doublea ,double b)
{return a+b;
}

二:事件

事件,使对象或类具备通知能力

日常开发中,自己声明事件的机会比较少,一般是用已有事件比较多...

java中没有委托,事件这么一说,只用Interface来实现

1:五个重要因素

事件的拥有者

事件成员(Event)

事件的响应者(Event Subscriber)

事件处理器(Event handler,本质上是回调方法)

事件订阅(+=)

他们之间的关系可以如下几种:

①事件的拥有者类和事件的响应者是不同的类

using System.Timers;
using UnityEngine;public class EventTimothyLiu1 : MonoBehaviour
{private void Start(){//世间间隔,每过1s就触发Elesap事件Timer timer = new Timer();timer.Interval = 1000;Boy boy = new();Girl girl = new();timer.Elapsed += boy.OnAction;timer.Elapsed += girl.OnAction;timer.Start();}
}
public class Boy
{internal void OnAction(object sender, ElapsedEventArgs e){Debug.Log("1");}
}
public class Girl
{internal void OnAction(object sender, ElapsedEventArgs e){Debug.Log("2");}
}

在该示例中,事件的拥有者是Timer类,事件的响应者是自定义的Boy,Girl类

所以事件的响应者和拥有者是两个类

第二个例子:

using System;
using System.Windows.Forms;namespace EventLiu
{class Program{static void Main(string[] args){//事件的拥有者:FormForm form = new Form();//事件的响应者:ControllerController controller = new Controller(form);form.ShowDialog();}}class Controller{private Form form;/// <summary>/// CTOR再加Tab即可编写出构造器/// 也叫构造函数,每个类都必须有/// 在构建类的引用时自动运行的方法!/// </summary>public Controller(Form form){if (form!= null){//this就是类的实例//this后是我们定义的字段,后面是参数formthis.form = form;//Click是事件this.form.Click += this.FormClicked;}}/// <summary>/// 事件处理器/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void FormClicked(object sender, EventArgs e){this.form.Text = DateTime.Now.ToString();}}
}

上述的代码段中,我们引入了Form名称空间

事件的拥有者是Form,事件的响应者是Controller

②事件的拥有者同时也是事件的响应者

using System;
using System.Windows.Forms;namespace EventLiu
{class Program1{static void Main(string[] args){//事件的拥有者:myForm//事件的接受者:myFormMyForm myForm = new MyForm();//事件:ClickmyForm.Click += myForm.FormClicked;}}/// <summary>/// 继承Form/// </summary>class MyForm : Form{/// <summary>/// 事件的处理器/// </summary>/// <param name="sender"></param>/// <param name="e"></param>internal void FormClicked(object sender, EventArgs e){this.Text = DateTime.Now.ToString();}}
}

事件的拥有者是Form

事件的响应者也是myForm的实例

③事件的拥有者是事件的响应者的成员(频率最高)

事件的响应者用自己的方法订阅者自己的字段成员的事件

using System;
using System.Windows.Forms;namespace EventLiu
{class Program1{static void Main(string[] args){MyForm myForm = new MyForm();myForm.ShowDIalog();}}class MyForm :Form{private TextBox textBox;//从订阅看事件拥有者就是buttonprivate Button button;public MyForm(){this.textBox = new TextBox();this.button = new Button();this.Controls.Add(this.button);this.Controls.Add(this.textBox);//Click是事件//事件的响应者是this,也就是MyForm的实例对象this.button.Click += this.ButtonClicked;}//事件处理器private void ButtonClicked(object sender, EventArgs e){this.textBox.Text = "Hello";}}
}

在该段代码中,我们自己创建MyForm类,继承自Form

事件的拥有者是该类中的成员Button,事件的响应者是该类的实例化

也就是儿子有事件,爸爸订阅了。                                                                                                                                           

                                                                                                                                                                                                                                                                                 

④事件的响应者是事件的拥有者的成员

2:事件的完整声明格式

3:事件的简单声明格式

3:UnityEvent

4:UnityAction

5:模板方法,回调函数


三、CPU和GPU的区别

CPU和GPU从名字上来说,一个是Central Processing Unit,一个是Graphic Processing Unit

,后者是专门对图像进行处理的,为什么要针对图像处理要用专门的处理单元呢?

GPU(图形处理器)是图形系统结构的重要元件,是连接计算机和显示终端的纽带

就是说如果你要把图像显示在显示器上,必须要使用GPU,而GPU是如何工作的?可以参见下面的视频:

GPU工作原理_哔哩哔哩_bilibili

来看看CPU和GPU的内部结构

 从图中可以看出,我们GPU有大量的运算单元,而CPU只有简单的4个ALU,而我GPU有成百上千的计算单元,我们单论单线的计算能力,比如你把一个数学中的复杂运算交给CPU,效率会变得特别高,它也理所当然能够完成任务,但是在图形计算方面,我们并没有呢么多高级运算,而是要进行大量的矩阵运算变换,也就是所谓的顶点计算光栅化计算→纹理帖图→像素处理→最终输出

而在这样的运算中,都是一个一个像素点进行处理的,对于高像素的屏幕,有非常多的像素点,而对于每个像素点都得进行大量的计算,所以使用CPU效率实在太低,此时如果使用GPU,效率会变得很高,但是要注意的是:

光影都是CPU计算的,GPU只有2个工作,1多边形生成。2为多边形上颜色。

如下视频可以简单的告诉你CPU和GPU的区别...

NVIDIA现场形象展示CPU和GPU工作原理上的区别_哔哩哔哩_bilibili

这就是简单的CPU和GPU的区别介绍


四、堆和栈的区别

计算机的逻辑运算在CPU中进行,CPU中又有ALU(Arithmetic/Logic Unit)和CU(Control Unit)

ALU是由"And Gate"(与门) 和"Or Gate"(或门)构成的算术逻辑单元,主要功能是进行二位元的算术运算

而CU是负责程序的流程管理。正如工厂的物流分配部门,控制单元是整个CPU的指挥控制中心,由指令寄存器IR(Instruction Register)、指令译码器ID(Instruction Decoder)和操作控制器OC(Operation Controller)三个部件组成

问题就出在,在计算机进行计算时,并不是将所有的数据都放在CPU,而是放在内存中,CPU对其进行调用,将内存中的数据放在寄存器中,所以CPU根据计算需求对内存进行调用,而我们说的堆和栈就是在内存中的两个区域

栈内存(Stack):栈中存放的是对象的引用及对象方法中的局部变量的值(参数的值),由操作系统自动分配释放

                               栈内存是动态分配和静态分配结合,是局部的

                                入栈和出栈遵循弹夹原则,先进后出,后进先出

                                栈的生长方向向下,内存地址由高到低

堆内存(Heap):堆中存放的是实例对象及成员变量的值(属性的值),堆由开发人员分配和释放, 若开发人员不释放,程序结束时由 OS 回收

                                堆是动态分配的,是全局的

                                堆可以被看成是一棵树,如:堆排序

                                堆的生长方向向上,内存地址由低到高


五、值类型和引用类型/装箱和拆箱

值类型:C#的所有值类型均隐式派生自System.ValueType。值类型是直接存储该值的

              byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。

              值类型在声明后,不管有没有赋值,都已分配了内存

引用类型:引用类型是存储该类型的引用

              string 和 class,数组,接口,委托统称为引用类型。

               引用类型在声明后,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间;当使用 new 创建一个类的实例时,分配堆上的空间。

装箱和拆箱:

知道了值类型和引用类型以后,就牵扯一件事,这两种类型之间需要转换,比如

ArrayList arraylist = new ArrayList();
arraylist[0].add(1);
arraylist[1].add('a');
...

此时我们需要将值类型的1和字符类型的a放在引用类型的数组中arraylist中,我们知道所有数据类型的基类是object,所以要想把值类型的对象放在引用类型的对象中,需要将值类型转换为object,这种转化是隐士进行的,此时上面的数组中的0号元素就是引用类型的

再看下一段

int a  = (int)arraylist[0];

此时我们是把上面数组中的引用类型转化为值类型int,此时就进行了强转化


六、Array/ArrayList/List

明了...


七、抽象类/接口以及区别

具体类→抽象类→接口:越来越抽象,内部实现的东西越来越少

 

1:抽象类

抽象类是未完全实现逻辑的类

抽象类为复用而生,专门用作基类

封装确定的,开放不确定的,推迟到合适的子类来实现

抽象类的成员可以是私有的,受保护的,内部的

using UnityEngine;
using System;public class OCPandObstract : MonoBehaviour
{private void Start(){Vehicle1 vehicle1 = new();vehicle1.Run();//无法实例化抽象类,只能实现其子类Vehicle2 v = new Car2();v.Stop();}
}
/// <summary>
/// 一个汽车类,一个卡车类,里面的方法都是一样的,重新写两个类就很繁琐
/// </summary>
class Car
{public void Run(){Console.WriteLine("Car is running ..");}public void Stop(){Console.WriteLine("Stopped...");}
}
class Truck
{public void Run(){Console.WriteLine("Car is running ..");}public void Stop(){Console.WriteLine("Stopped...");}
}/// <summary>
/// 简化方法1:使用虚函数进行重写,符合开闭原则
/// </summary>
class Vehicle1
{public void Stop(){Console.WriteLine("Stopped...");}public virtual void Run(){Console.WriteLine("Vehicle is running...");}
}
class Car1:Vehicle1
{public override void Run(){Console.WriteLine("Car1 is running...");}
}
class Truck1:Vehicle1
{public override void Run(){Console.WriteLine("Truck1 is running...");}
}/// <summary>
/// 简化方法2:,使用抽象类,抽象函数,也就是纯虚方法
/// 此时抽象类无法实例化
/// </summary>
abstract class Vehicle2
{public  void Stop(){Console.WriteLine("Stopped...");}/// <summary>/// Run需要重写,因此作为抽象函数,没有实现部分/// </summary>public abstract void Run();
}
class Car2 : Vehicle2
{public override void Run(){Console.WriteLine("Car2 is running...");}
}
class Truck2 : Vehicle2
{public override void Run(){Console.WriteLine("Truck2 is running...");}
}

上述代码一步步介绍了为什么使用抽象类,怎么使用抽象函数

2:接口

接口是完全未实现逻辑的“类”

接口是“纯虚类”,只有成员函数,成员全部public

接口为解耦而生,高内聚,低耦合

继承自接口的类必须实现接口中的函数,且自身无法实现

接口中可以有属性,方法,事件,索引

接口成员默认是公开的,且不加任何修饰符

using UnityEngine;public class OCPandInterface : MonoBehaviour
{}
/// <summary>
/// 纯抽象类
/// </summary>
abstract class AnimalBase
{abstract public void Eat();abstract public void Sleep();abstract public void Walk();
}
/// <summary>
/// 抽象类,继承自纯抽象类
/// </summary>
abstract class Animal : AnimalBase
{public override void Eat(){}public override void Sleep(){}
}
/// <summary>
/// 具体类
/// </summary>
class Dog:Animal
{public override void Walk(){}
}
/// <summary>
/// 具体类
/// </summary>
class Duke : Animal
{public override void Walk(){}
}/// <summary>
/// 引入interface,它成员变量默认为抽象且公开
/// </summary>
interface IAnimalBase
{void Eat();void Sleep();void Walk();
}
abstract class Animal1 : IAnimalBase
{/// <summary>/// 继承接口以后,也变成了具体方法/// </summary>public void Eat(){}public void Sleep(){}public abstract void Walk();
}
class Dog1 : Animal1
{public override void Walk(){}
}
class Duke1 : Animal1
{public override void Walk(){}
}

上述代码描述了如何引入的接口,且接口如何定义

3:抽象类和接口的区别


八、属性(Get访问器和Set)和字段,static关键字

首先看看C#有哪些成员

 1:字段(field)

字段是一种表示与对象或类型关联的变量,也叫成员变量

看如下代码,可以看出字段是如何一步步变成属性

using UnityEngine;
using System;public class GetSetProperty : MonoBehaviour
{private void Start(){//一、未使用Get/Set属性Student stu1 = new();Student stu2 = new();Student stu3 = new();stu1.Age = 20;stu2.Age = 20;stu3.Age = 20;//此时如果有一个年龄被不小心修改了,比如第三个学生年龄修改成200,这种字段被污染很难发现int avgAge = (stu1.Age + stu2.Age + stu3.Age) / 3;//Debug.Log(avgAge);//二、使用Get/Set方法Student1 stu4 = new();Student1 stu5 = new();Student1 stu6 = new();//此时如果不小心将年龄修改成200,程序就会报错//可以使用try catch,程序就不会崩溃stu4.SetAge(20);stu5.SetAge(20);//stu6.SetAge(200);int avgAge1 = (stu4.GetAge() + stu5.GetAge() + stu6.GetAge())/3;try{stu6.SetAge(200);Debug.Log(avgAge1);}catch (Exception ex){Debug.Log(ex.Message);}//三、使用Get/Set访问器Student2 stu7 = new Student2();Student2 stu8 = new Student2();Student2 stu9 = new Student2();stu7.Age = 20;stu8.Age = 20;stu8.Age = 20;int avgAge2 = (stu7.Age + stu8.Age + stu9.Age) / 3;Debug.Log(avgAge2);}
}
class Student
{public int Age;public int Score;
}/// <summary>
/// 二、此时使用Get,Set函数,可以对字段进行约束
/// </summary>
class Student1
{private int age;public int GetAge(){return this.age;}/// <summary>/// /// </summary>/// <param name="value"></param>public void SetAge(int value){if (value >= 0 && value <= 120){this.age = value;}elsethrow new System.Exception("value has error");}
}/// <summary>/// 三、使用微软的Get/Set访问器/// </summary>
class Student2
{private int age;public int Age{get{return age;}set{if (value >= 0 && value <= 120){this.age = value;}else{throw new Exception("Age value has error");}}}
}

刚开始我们使用字段存储数据

但是考虑到暴露的缘故,我们引入了Get和Set函数来对字段进行约束

微软对Get/Set访问器进行了简化,就形成了Get/Set访问器

可以使用PropFull进行快速生成属性

2:属性(Prooerty)

属性是一种用于访问对象或类型的特征的成员,属性是字段的自然扩展

3:属性和字段的关系

属性和字段都是用于表示实体的状态

属性大多数情况是字段的包装器

建议:永远使用属性来暴露数据,即字段永远是private或protected的

4:static关键字

static关键字可以在类的定义,变量的声明,方法的定义中

变量前加上Static,变量成为静态变量,静态变量的内存分布在全局静态区,相当于它就是全局变量,Time.timescale就是静态变量

在函数前加上static,函数就变成了静态函数,直接类名+函数名就可以调用,比如Debug,或者Find函数都是静态函数

在类名的前面加上static,该类就变成了静态类,静态类不需要被实例化它不能继承,静态类内的成员都需要带上static关键字,但是静态函数不需要一定在静态类中

一般情况下,将工具函数或者工具类,做成静态类或者静态函数。


九、匿名方法/λ表达式的用法/LinQ用法


十、字典,队列,哈希表,Stack和Queue


十一、Unity中AB包何时使用以及如何使用


十二、Unity中的数据加载方式有几种?


13:容器/迭代器

14:射线检测,碰撞检测

15:图形学的渲染流程是什么?

16:有哪些常见的渲染算法

相关文章:

Unity常见面试题详解(持续更新...)

一丶声明、定义、实例化、初始化 1、首先我们来讨论在C/C中的声明和定义.. 1&#xff09;我们先从函数声明和定义说起... 一般我们在C里都会先定义一个函数&#xff0c;然后再Main函数前将函数声明&#xff0c;比如&#xff1a; //函数声明 int Add(int);int Main {} //函数…...

java高级篇之三大性质总结:原子性、可见性以及有序性

1. 三大性质简介 在并发编程中分析线程安全的问题时往往需要切入点&#xff0c;那就是两大核心&#xff1a;JMM抽象内存模型以及happens-before规则&#xff08;在这篇文章中已经经过了&#xff09;&#xff0c;三条性质&#xff1a;原子性&#xff0c;有序性和可见性。关于sy…...

真涨脸,我用 Python 为朋友自动化整理表格

今天&#xff0c;在工作的时候&#xff0c;我的美女同事问我有没有办法自动生成一个这样的表格&#xff1a; 第一列是院校科目&#xff0c;第二列是年份&#xff0c;第三列是数量。 这张表格是基于这一文件夹填充的&#xff0c;之前要一个文件夹一个文件夹打开然后手动填写年份…...

MySQL学习笔记(1.操作数据库与数据的SQL)

1. 下载安装 参照&#xff1a;MySQL8.0下载安装_凯尔萨厮的博客-CSDN博客 2. MySQL启动与停止 方式(1).我的电脑>右键>管理>服务和应用程序>服务>&#xff08;或在windows搜索栏输入services.msc&#xff09; 找到MySQL80&#xff0c;右键启动或停止 方式(2…...

C++——特殊类设计

目录 不能被拷贝的类 只能在堆上创建对象的类 只能在栈上创建对象的类 不能被继承的类 只能创建一个对象的类(单例模式) 饿汉模式 懒汉模式 单例对象释放问题 不能被拷贝的类 C98&#xff1a;将拷贝构造函数与赋值运算符重载只声明不定义&#xff0c;并且将其访问权…...

Scratch少儿编程案例-植物大战僵尸-趣味角色版

专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册点击跳转=>Scratch编程案例👉关于作者...

Vue的路由守卫

对于绝大部分的网站而言&#xff0c;都是有个人主页的&#xff0c;但是你如果没登陆的话&#xff0c;还能访问个人主页吗&#xff1f; 从逻辑上来讲&#xff0c;那肯定是不行的。 所以&#xff0c;要怎么阻止没登录状态下去访问个人主页呢&#xff1f; 就是利用路由守卫&#x…...

【算法】151. 反转字符串中的单词

链接&#xff1a;https://leetcode.cn/problems/reverse-words-in-a-string/给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结…...

Azure AI基础到实战(C#2022)-认知服务(2)

目录 ComputerVisionClient Class定义构造函数属性上一节例子Task.Wait 方法其它部分分析winform调用认知服务代码剖析1、调用参数2、定义ComputerVisionClient对象,准备调用 REST API3、Authenticate4、调用REST API,这是重点和关键(1)Lambda 表达式和匿名函数(2)async(3)…...

并发就一定快吗?答:肯定不是啊

文章目录一、多线程概念1.1 程序的并发与并行1.1.1 程序的并行1.1.2 程序的并发1.2 进程与线程1.2.1 进程1.2.2 线程1.2.3 多线程并发就一定快吗&#xff1f;答案直接戳这里&#x1f449;&#xff1a;多线程并发就一定快吗&#xff1f; 一、多线程概念 在实际应用中&#xff…...

前端的学习路线和方法

一些前端工程师面临的现状 1.没有系统的的学习基础知识 2.技术上存在短板&#xff0c;说句不好听的话&#xff0c;大多数开发者的上升通道都没有明确的路线&#xff0c;大公司还好&#xff0c;小公司基本都是后端作为开发组组长 3.前端各种技术层出不穷&#xff0c;需要花费…...

用C语言写一个自己的shell-Part Ⅱ--execute commands

Part Ⅱ–execute commands Exec This brings us to the exec family of functions. Namely, it has the following functions: execlexecvexecleexecveexeclpexecvp For our needs,we will use execvp whose signature looks like this int execvp(const char *file, cha…...

案例实践|运营腾讯游戏,Proxima Beta 使用 Apache Pulsar 升级团队协作与数据治理...

文章摘要本文整理自 Pulsar Summit Asia 2022 上&#xff0c;Proxima Beta 软件工程师施磊的分享《How to achieve better team integration and data governance by using Apache Pulsar》。本文首先将为大家介绍 CQRS 和 Event Sourcing 概念&#xff0c;便于了解为何 Proxim…...

Hudi的7种索引

1、Bloom Index Bloom Index (default) 使用根据记录键构建的bloom过滤器&#xff0c;也可以使用记录键范围修剪候选文件.原理为计算RecordKey的hash值然后将其存储到bitmap中&#xff0c;为避免hash冲突一般选择计算3次 HoodieKey 主键信息&#xff1a;主要包含recordKey 和p…...

Linux内核(十三)系统软中断 software

文章目录中断概述Linux内核中断软中断相关代码解析软中断结构体软中断类型软中断两种触发方式函数__do_softirq解析定时器的软中断实现解析定时器相关代码总结Linux版本&#xff1a;linux-3.18.24.x 中断概述 中断要求     快进快出&#xff0c;提高执行效率&#xff0c;…...

Linux -- 查看进程 PS 命令 详解

我们上篇介绍了&#xff0c; Linux 中的进程等概念&#xff0c;那么&#xff0c;在Linux 中如何查看进程呢 &#xff1f;&#xff1f;我们常用到的有两个命令&#xff0c; PS 和 top 两个命令&#xff0c;今天先来介绍下 PS 命令~&#xff01;PS 命令 &#xff1a;作用 &#x…...

C2科一考试道路通行规定

目录 低能见度等恶劣环境下的通行规定 驾驶机动车禁止行为 停车规定 通行常识 高速公路限速规定 三观不一样的人&#xff0c;无论重来多少次&#xff0c;结果都一样 他不会懂你的委屈 只是觉得自已没错 两个人真正的可悲连吵架都不在一个点上 有句话说得好 我要是没点自我…...

进程概念(详细版)

进程的概念本文主要介绍进程的相关知识 文章目录认识冯诺依曼体系结构操作系统的基本概念操作系统的作用是什么系统调用和库函数相关概念进程基本概念描述进程进程控制块(PCB)task_struct 结构体进程是如何被操作系统管理起来的先描述再组织描述好&#xff0c;组织好&#xff0…...

学习大数据应该掌握哪些技能

想要了解大数据开发需要掌握哪些技术&#xff0c;不妨先一起来了解一下大数据开发到底是做什么的~ 1、什么是大数据&#xff1f; 关于大数据的解释&#xff0c;比较官方的定义是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模…...

【spring】Spring Data --Spring Data JPA

Spring Data 的委托是为数据访问提供熟悉且符合 Spring 的编程模型&#xff0c;同时仍保留着相关数据存储的特​​殊特征。 它使使用数据访问技术、关系和非关系数据库、map-reduce 框架和基于云的数据服务变得容易。这是一个伞形项目&#xff0c;其中包含许多特定于给定数据库…...

mysql数据库之视图

视图&#xff08;view&#xff09;是一种虚拟的存在&#xff0c;视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的。 通俗的讲&#xff0c;视图之保存了查询的sql逻辑&#xff0c;不保存查询结…...

数据库事务详解

概述事务就是数据库为了保证数据的原子性,持久性,隔离性,一致性而提供的一套机制, 在同一事务中, 如果有多条sql执行, 事务可以确保执行的可靠性.数据库事务的四大特性一般来说, 事务是必须满足 4 个条件&#xff08;ACID&#xff09;&#xff1a;原子性&#xff08;Atomicity&…...

Nessus: 漏洞扫描器-网络取证工具

Nessue 要理解网络漏洞攻击&#xff0c;应该理解攻击者不是单独攻击&#xff0c;而是组合攻击。因此&#xff0c;本文介绍了关于Nessus历史的研究&#xff0c;它是什么以及它如何与插件一起工作。研究了Nessus的特点&#xff0c;使其成为网络取证中非常推荐的网络漏洞扫描工具…...

操作系统实战45讲之现代计算机组成

我以前觉得计算机理论不让我感兴趣&#xff0c;而比较喜欢实践&#xff0c;即敲代码&#xff0c;现在才发现理论学好了&#xff0c;实践才能有可能更顺利&#xff0c;更重要的是理论与实践相结合。 在现代&#xff0c;几乎所有的计算机都是遵循冯诺依曼体系结构&#xff0c;而遵…...

Simple Baselines for Image Restoration

Abstract.尽管近年来在图像恢复领域取得了长足的进步&#xff0c;但SOTA方法的系统复杂性也在不断增加&#xff0c;这可能会阻碍对方法的分析和比较。在本文中&#xff0c;我们提出了一个简单的基线&#xff0c;超过了SOTA方法&#xff0c;是计算效率。为了进一步简化基线&…...

Python数据可视化:局部整体图表可视化(基础篇—6)

目录 1、饼图 2、圆环图 3、马赛克图 4、华夫饼图 5、块状/点状柱形图 在学习本篇博文之前请先看一看之前发过的关联知识:...

CSDN新星计划新玩法、年度勋章挑战赛开启

文章目录&#x1f31f; 写在前面&#x1f31f; 逐步亮相的活动&#x1f31f; 勋章挑战赛&#x1f31f; 新星计划&#x1f31f; 有付费课程才可参与&#xff1f;&#x1f31f; 成就铭牌&#x1f31f; 博客跟社区的关系&#x1f31f; 写在最后&#x1f31f; 写在前面 哈喽&#…...

Docker之部署Mysql

通过docker对Mysql进行部署。 如果没有部署过docker&#xff0c;看我之前写的目录拉取镜像运行容器开放端口拉取镜像 前往dockerHub官网地址&#xff0c;搜索mysql。 找到要拉取的镜像版本&#xff0c;在tag下找到版本。 拉取mysql镜像&#xff0c;不指定版本数&#xff0c…...

基于C/C++获取电脑网卡的IP地址信息

目录 前言 一、网卡是什么&#xff1f; 二、实现访问网卡信息 1.引入库及相关的头文件 2.操作网卡数据 3. 完整代码实现 4.结果验证 总结 前言 简单示例如何在windows下使用c/c代码实现 ipconfig/all 指令 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考…...

28相似矩阵和若尔当标准型

一、关于正定矩阵的一些补充 在此之前&#xff0c;先讲一下对称矩阵中那些特征值为正数的矩阵&#xff0c;这样特殊的矩阵称为正定矩阵。其更加学术的定义是&#xff1a; SSS 是一个正定矩阵&#xff0c;如果对于每一个非零向量xxx&#xff0c;xTSx>0x^TSx>0xTSx>0 正…...

哪里有做直销网站的/福州seo优化排名推广

A、MySQL 备份工具xtrabackup 的安装1. percona 官方xtrabackup 的二进制版本&#xff1b;二进制版本解压就能用了。2. 解压xtrabackup &创建连接tar -xzvf percona-xtrabackup-2.3.4-Linux-x86_64.tar.gz -C /usr/local/ln -s /usr/local/percona-xtrabackup-2.3.4 /usr/l…...

广告设计与制作学什么/网站优化服务

文章摘要&#xff1a;幼儿园的教育方式在逐步发生改变,以游戏贯穿幼儿教学已经成为当下幼儿教育的主流.在对幼儿实施游戏化教育中,我们对此进行了如下探索与研究.一、幼儿为什么要游戏化教学幼儿教学游戏化,是指把幼儿教育的目标、内容、要求融于各种游戏之中,教学游……幼儿教…...

新昌做网站/网站的seo

原文链接&#xff1a;https://hellogis.yuque.com/docs/share/351e9e9d-831f-47bc-a7c6-871528beb8c2?# 《Arcpy》 文章目录介绍按需开发的思路系统学习使用ArcPy的方法相关文章介绍 Arcpy是ArcGIS给出的一种地理处理处理方式&#xff0c;用Python实现 在ArcGIS体系中&#…...

武汉网站推广¥做下拉去118cr/宣传软文是什么意思

“我可能干了个假的数据分析师&#xff01;”经常有同学发出这种感慨&#xff0c;然后到处发《数据分析师是干什么的》《数据分析师、数据工程师、数据运营、数据挖掘工程师、商业数据分析师、我随便写个什么分析师之间到底有什么区别》一类的帖子。之所以会这样&#xff0c;是…...

彩票网站做代理/网络营销的缺点及建议

首先查看配置内mysqlDriver 是否匹配&#xff1a; com.mysql.jdbc.Driver 是 mysql-connector-java 5中的&#xff0c;com.mysql.cj.jdbc.Driver 是 mysql-connector-java 6中的 其次查看pom内驱动是否版本对应、 mysql的版本对应jdbc驱动的版本 Connector/J 5.1 支持Mysql 4.…...

wordpress 当前分类名称/百度推广排名怎么做的

SPKT/DSM接口介绍 给卫星接收无关&#xff0c;是一个叫做JR的遥控器公司给自己遥控器取得名字叫做卫星接收&#xff0c;其实和普通遥控器的差别主要在于信号调制方式不一样。...