Looks like a pointer indeed.
编辑:从 Rust 的角度来看,person 包含实际的 struct,因此在 Rust 代码 let person = Person{age : 52}; 中,变量 person 不是指针并且不是 包含一个指针。但是,它可以实现为指针,如下面的 LLVM IR 所示。因此,Rust 代码可以转换为 LLVM IR,其中 %person 确实是指向结构第一个元素的指针。请注意,此 IR 可以通过这样一种方式进行优化,即实际数据可以最终存储在寄存器中,因此不一定在堆栈中。
main 的 LLVM IR 如下所示:
; playground::main
; Function Attrs: nonlazybind uwtable
define internal void @_ZN10playground4main17h5b277f290810a924E() unnamed_addr #1 !dbg !315 {
start:
%arg0.dbg.spill = alloca i32*, align 8
%_11 = alloca i32*, align 8
%_10 = alloca [1 x { i8*, i64* }], align 8
%_3 = alloca %"std::fmt::Arguments", align 8
%person = alloca i32, align 4
call void @llvm.dbg.declare(metadata i32* %person, metadata !319, metadata !DIExpression()), !dbg !328
store i32 52, i32* %person, align 4, !dbg !329
// ...
}
-
%person = alloca i32, align 4 为 i32 on the stack and returns a pointer 分配空间(所以 person 是一个指针)
-
store i32 52, i32* %person, align 4 将整数 52 存储到该指针中。代码i32* %person 表示%person 的类型为i32*,因此又是一个指向整数的指针。
如果将结构更改为struct Person { age: i32, thing: bool },例如,对应的IR 将是%person = alloca { i32, i8 }, align 4,所以现在它是一个指向{ i32, i8 } 类型结构的指针。
现在存储整数 52 需要一些转换:
%0 = bitcast { i32, i8 }* %person to i32* // cast %person to i32*
store i32 52, i32* %0, align 4