- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经在多个上下文中读到术语“胖指针”,但我不确定它的确切含义以及它在 Rust 中的使用时间。指针好像是普通指针的两倍大,但我不明白为什么。它似乎也与特征对象有关。
最佳答案
术语“胖指针”用于指代对动态大小类型 (DST) – 切片或特征对象的引用和原始指针。一个胖指针包含一个指针加上一些使 DST “完整”的信息(例如长度)。
Rust 中最常用的类型不是 DST,但在编译时具有已知的固定大小。这些类型实现了 the Sized
trait .甚至管理动态大小的堆缓冲区的类型(如 Vec<T>
)也是 Sized
,因为编译器知道确切的字节数 a Vec<T>
实例将占用堆栈。目前 Rust 中有四种不同的 DST。
[T]
和 str
)类型[T]
(对于任何 T
)是动态大小的(特殊的“字符串切片”类型 str
也是如此)。这就是为什么您通常只将其视为 &[T]
的原因。或 &mut [T]
,即在引用后面。该引用是所谓的“胖指针”。让我们检查一下:
dbg!(size_of::<&u32>());
dbg!(size_of::<&[u32; 2]>());
dbg!(size_of::<&[u32]>());
这会打印(经过一些清理):
size_of::<&u32>() = 8
size_of::<&[u32; 2]>() = 8
size_of::<&[u32]>() = 16
所以我们看到对普通类型的引用,如 u32
是 8 个字节大,就像对数组的引用一样 [u32; 2]
.这两种类型不是 DST。但是作为[u32]
是 DST,对它的引用是两倍大。 在切片的情况下,“完成”DST 的附加数据就是长度。因此可以说 &[u32]
的表示形式是这样的:
struct SliceRef {
ptr: *const u32,
len: usize,
}
dyn Trait
)当使用 trait 作为 trait 对象时(即类型删除、动态调度),这些 trait 对象是 DST。示例:
trait Animal {
fn speak(&self);
}
struct Cat;
impl Animal for Cat {
fn speak(&self) {
println!("meow");
}
}
dbg!(size_of::<&Cat>());
dbg!(size_of::<&dyn Animal>());
这会打印(经过一些清理):
size_of::<&Cat>() = 8
size_of::<&dyn Animal>() = 16
再次,&Cat
只有 8 个字节大,因为 Cat
是普通类型。但是dyn Animal
是一个特征对象,因此动态调整大小。因此,&dyn Animal
有 16 个字节大。
在 trait 对象的情况下,完成 DST 的附加数据是指向 vtable(vptr)的指针。我不能在这里完全解释 vtables 和 vptr 的概念,但它们是用于在此虚拟分派(dispatch)上下文中调用正确的方法实现。 vtable 是一个静态数据,基本上只包含每个方法的函数指针。这样,对特征对象的引用基本上表示为:
struct TraitObjectRef {
data_ptr: *const (),
vptr: *const (),
}
(这与 C++ 不同,在 C++ 中,抽象类的 vptr 存储在对象中。两种方法各有利弊。)
实际上可以通过最后一个字段是 DST 的结构来创建自己的 DST。不过,这种情况很少见。一个突出的例子是 std::path::Path
.
自定义 DST 的引用或指针也是一个胖指针。附加数据取决于结构内 DST 的类型。
在RFC 1861 , extern type
功能被引入。外部类型也是 DST,但指向它们的指针不是胖指针。或者更准确地说,正如 RFC 所说:
In Rust, pointers to DSTs carry metadata about the object being pointed to. For strings and slices this is the length of the buffer, for trait objects this is the object's vtable. For extern types the metadata is simply
()
. This means that a pointer to an extern type has the same size as ausize
(ie. it is not a "fat pointer").
但如果您不与 C 接口(interface)交互,您可能永远不必处理这些外部类型。
在上面,我们已经看到了不可变引用的大小。胖指针对于可变引用、不可变原始指针和可变原始指针的工作方式相同:
size_of::<&[u32]>() = 16
size_of::<&mut [u32]>() = 16
size_of::<*const [u32]>() = 16
size_of::<*mut [u32]>() = 16
关于pointers - 什么是 "fat pointer"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57754901/
我正在用 C 实现 FAT 文件系统。我遵循 microsoft 发布的规范 ( http://read.pudn.com/downloads77/ebook/294884/FAT32%20Spec%
我正在尝试从具有 armv6 和 armv7 架构的库中删除重复对象,即, $ lipo -info libx.a Architectures in the fat file: libx.a are:
我正在学习 FAT 文件系统以及如何计算 FAT 大小。现在,我有这个问题: 假设磁盘大小为 32 MB,块大小为 1 KB。计算FAT16的大小。 现在,我知道要计算它,我们将每个条目的位数乘以块数
我正在使用 Chan's FAT library这似乎提供了一个标准的 FAT 文件系统 API。 API 似乎没有直接提供列出给定目录中的所有文件。 列出可以访问标准 FAT API 的目录中所有文
我有一个数据库实现,每条记录一个文件,我有大约 10000 条记录。我正在尝试优化访问文件的性能,但我有点怀疑。 将文件拆分到文件夹中是否比将所有文件保存在单个文件夹中更好,以便快速访问文件?例如:文
我需要用 C 创建我自己的文件系统实现。我正计划创建一个类似于 FAT 系统的系统。我们得到一个大小为 10MB 的文件,它充当我们自己的“磁盘”。我知道 FAT 表存储簇号,根目录存储我们创建的每个
我正在尝试使用自定义引导加载程序开发一个小型操作系统。我在 OSDEV 方面有一点经验,但没有那么多......我的问题是第一阶段引导加载程序没有从磁盘加载秒数。这是 boot.asm 文件: org
最近在处理我的代码时,我注意到一些内存使用量显着增加,我在我的代码中看不到很多原因。所以我想知道是否有任何程序、技术或其他类型的工具可以扫描我的代码(Delphi)并为我估计哪些过程、函数和函数将是最
我知道这个问题已经被提出过多次,但我的目标与我在网上搜索到的内容略有不同。具体来说,我已经能够为 iPhone 构建静态库,但我能够构建的最终 fat 文件仅包含 arm 和 i386 架构(并且我不
我已经在几个上下文中阅读过“胖指针”这个术语,但我不确定它的确切含义以及它何时在 Rust 中使用。指针似乎是普通指针的两倍,但我不明白为什么。它似乎也与特征对象有关。 最佳答案 术语“胖指针”用于指
因此,我正在翻译示例代码,该示例代码说明如何使用Gradle从GroovyDSL到KotlinDSL创建胖子(我正在使用Gradle 5.3.1)。 我得到了GroovyDSL代码here: jar
我的 CPU 是小端字节序,文档告诉我它符合 FAT 规范的字节顺序。那么为什么我得到了 BS_jmpBoot 的有效地址(第一个扇区的字节 0-3),却没有得到 BPB_BytesPerSec 的有
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
我正在寻找一种方法来纯粹外部化 Spring boot 应用程序中的一些配置设置。例如:当双击 fat-JAR 文件时,它会从中加载配置,例如 myConfig.config,该文件与 fat-JAR
当涉及到使用 FAT 的文件系统时,这里出现了一个关于随机访问的直截了当的问题。 我看到了不同种类的图片/动画对 FAT 的不同解释,展示了不同的东西。我不明白如何在不通过文件一次的情况下进行随机访问
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
我正在编写一个嵌入式系统,其中我正在创建一个 USB 大容量存储设备驱动程序,该驱动程序使用 8MB RAM block 作为 FAT 文件系统。 尽管当时允许操作系统将我的 RAM 区域清零并格式化
这个问题在这里已经有了答案: ECMAScript 6 arrow function that returns an object (6 个答案) 关闭 5 年前。 是否可以将下面的代码写在一行中(
我正在尝试使用这些说明在 Windows 上安装无脂 crm http://guides.fatfreecrm.com/Setup-Microsoft-Windows.html 我正在安装mysql2
我已经在多个上下文中读到术语“胖指针”,但我不确定它的确切含义以及它在 Rust 中的使用时间。指针好像是普通指针的两倍大,但我不明白为什么。它似乎也与特征对象有关。 最佳答案 术语“胖指针”用于指代
我是一名优秀的程序员,十分优秀!