Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是与C++;? 锈迹中的P说他们从C++中借用了这个属性。我找不到关于这个话题的任何东西。有人能解释一下单态化是什么意思吗?_C++_Rust - Fatal编程技术网

什么是与C++;? 锈迹中的P说他们从C++中借用了这个属性。我找不到关于这个话题的任何东西。有人能解释一下单态化是什么意思吗?

什么是与C++;? 锈迹中的P说他们从C++中借用了这个属性。我找不到关于这个话题的任何东西。有人能解释一下单态化是什么意思吗?,c++,rust,C++,Rust,对此不太清楚;你能链接到演讲吗?这可能是一句不假思索的话 Herman可能创造了一个类似模板专门化的术语,它从模板生成相互不相关的类型/对象(不是多态的或“单态的”),模板是多态结构。单态化意味着生成泛型函数的专门版本。如果我编写一个函数来提取任意对的第一个元素: fn first<A, B>(pair: (A, B)) -> A { let (a, b) = pair; return a; } 编译器将生成两个版本的first(),一个专用于整数对,另一个专

对此不太清楚;你能链接到演讲吗?这可能是一句不假思索的话


Herman可能创造了一个类似模板专门化的术语,它从模板生成相互不相关的类型/对象(不是多态的或“单态的”),模板是多态结构。

单态化意味着生成泛型函数的专门版本。如果我编写一个函数来提取任意对的第一个元素:

fn first<A, B>(pair: (A, B)) -> A {
    let (a, b) = pair;
    return a;
}
编译器将生成两个版本的
first()
,一个专用于整数对,另一个专用于字符串对


这个名字来源于编程语言术语“多态性”——意思是一个可以处理多种类型数据的函数。单形化是从多态代码到单形代码的转换。

不确定是否有人还在看这个,但Rust文档确实提到了如何通过这个过程实现无成本抽象。发件人:

您可能想知道,当您 使用泛型类型参数。好消息是生锈的工具 泛型,使您的代码不会使用 泛型类型要比具体类型好

Rust通过对生成的代码执行单植根来实现这一点 正在编译时使用泛型。单晶化是指 通过填充混凝土将通用代码转换为特定代码 编译时使用的类型

在此过程中,编译器执行与我们使用的步骤相反的操作 创建清单10-5中的泛型函数:编译器查看 调用泛型代码并为 调用泛型代码时使用的具体类型

让我们通过一个使用该标准的示例来了解它是如何工作的 库的选项枚举:

let integer=Some(5);
让浮动=一些(5.0);
当Rust编译此代码时,它执行单晶化。在期间 在该过程中,编译器读取已在中使用的值 选项实例并标识两种类型的选项:一种是i32 另一个是f64。因此,它扩展了 选项转换为选项_i32和选项_f64,从而替换 一般定义和具体定义

代码的单形态版本如下所示。这个 通用选项将替换为由创建的特定定义 编译器:

//文件名:src/main.rs
枚举选项_i32{
一些(i32),
没有一个
}
枚举选项\u f64{
有些(f64),
没有一个
}
fn main(){
设integer=Option_i32::Some(5);
让float=Option_f64::Some(5.0);
}
因为Rust将泛型代码编译成指定类型的代码 在每个实例中,我们都不为使用泛型支付运行时成本。当 代码运行时,它的性能与我们复制每个代码时的性能一样 手工定义。单晶化过程使锈菌的 泛型在运行时非常有效


有一个很好的解释单晶在

单变体是通过填充编译时使用的具体类型,将泛型代码转换为特定代码的过程

从书本示例中,如果您已使用以下内容定义变量:

let integer=Some(5);
让浮动=一些(5.0);
当Rust编译此代码时,它执行单晶化。其间 过程中,编译器读取已在
选项中使用的值
实例并标识两种
选项
:一种是
i32
,另一种是 is
f64
。因此,它将
选项的一般定义扩展为
Option_i32
Option_f64
,从而将通用定义替换为 具体的

代码的单形态版本如下所示。泛型
选项
替换为编译器创建的特定定义:

文件名:src/main.rs

enum选项\u i32{
一些(i32),
没有一个
}
枚举选项\u f64{
有些(f64),
没有一个
}
fn main(){
设integer=Option_i32::Some(5);
让float=Option_f64::Some(5.0);
}

这是静态调度的另一个名称吗?@ TSePangNo不是,它更像C++模板和Java泛型之间的区别。在我看来,与在C++中java调用的(隐式)模板专长是一样的。不要与单态性混淆,单态性在逻辑上与多态性相反,即通过其父接口处理子类型。@tshepang静态调度是单态性的一种形式,特别是即席多态性的单态性。Ad Hoc多态性是C++和java中的锈迹和接口中的特征。这里的每个人都是指参数多态性的单形化,在C++中java和“模板”中称为“泛型”,这与静态调度非常不同,因为参数多态性与ad hoc多态性有很大的不同。注意java没有任何单一化,只有锈和C++。具体而言,(继续)(Read)(Read)和C++使用“专业化”来进行单态化参数多态性,如所接受的答案讨论的,默认情况下使用静态调度来单态化Ad Hoc多态性。它们还允许你在C++中使用生锈或虚拟方法来选择动态调度。相比之下,Java对所有东西都使用动态调度,甚至泛型(又称参数多态性)。欢迎来到Stack Overflow,谢谢你的回答。当提供主要由链接组成的aswer时,它是gen
first((1, 2));
first(("a", "b"));