我正在尝试学习一些关于LLVM IR的知识,特别是什么是rustc输出.即使是一个非常简单的案例,我也遇到了一些麻烦.
我将以下内容放在源文件中simple.rs:
fn main() {
let x = 7u32;
let y = x + 2;
}
Run Code Online (Sandbox Code Playgroud)
并运行rustc --emit llvm-ir simple.rs以获取simple.ll包含的文件
; ModuleID = 'simple.cgu-0.rs'
source_filename = "simple.cgu-0.rs"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: uwtable
define internal void @_ZN6simple4main17h8ac50d7470339b75E() unnamed_addr #0 {
start:
br label %bb1
bb1: ; preds = %start
ret void
}
define i64 @main(i64, i8**) unnamed_addr {
top:
%2 = call i64 @_ZN3std2rt10lang_start17ha09816a4e25587eaE(void ()* @_ZN6simple4main17h8ac50d7470339b75E, i64 …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个通用的结构,该结构具有通用实现特征的界限。该特征本身是通用的。这是 Rust 1.49.0 中的内容。
如果我这样做:
trait Foo<T> {}
struct Baz<F: Foo<T>> {
x: F,
}
Run Code Online (Sandbox Code Playgroud)
我收到编译错误,因为T未定义。但如果我定义它:
trait Foo<T> {}
struct Baz<T, F: Foo<T>> {
x: F,
}
Run Code Online (Sandbox Code Playgroud)
然后我收到编译器错误,因为T未使用。
唯一的选择似乎是包含一个PhantomData<T>字段,但如果我的通用依赖性变得更加复杂,这就会开始变得更加笨拙:
use std::marker::PhantomData;
trait Foo<T> {}
struct Baz<T, U, F: Foo<T>, G: Foo<U>> {
phantom_t: PhantomData<T>,
phantom_u: PhantomData<U>,
x: F,
y: G,
}
Run Code Online (Sandbox Code Playgroud)
我的领域一半都是幻影!该结构实际上闹鬼。
我的问题是:最后的例子编译真的是惯用的 Rust 吗?如果是这样,为什么 Rust 无法检测到TinBaz<T, Foo<T>>确实被使用了?