gpt4 book ai didi

optimization - 我可以将 "null pointer optimization"用于我自己的非指针类型吗?

转载 作者:行者123 更新时间:2023-11-29 07:40:38 30 4
gpt4 key购买 nike

当你有一个 Option<&T> ,编译器知道 NULL永远不是 &T 的可能值, 和 encodes the None variant as NULL instead .这样可以节省空间:

use std::mem;

fn main() {
assert_eq!(mem::size_of::<&u8>(), mem::size_of::<Option<&u8>>());
}

但是,如果您对非指针类型执行相同的操作,则没有额外的位来存储该值并且需要额外的空间:

use std::mem;

fn main() {
// fails because left is 1 and right is 2
assert_eq!(mem::size_of::<u8>(), mem::size_of::<Option<u8>>());
}

一般来说,这是正确的。但是,我想选择加入优化,因为我知道我的类型有某些不可能的值。作为一个虚构的例子,我可能有一个有年龄的玩家角色。年龄可能未知,但绝不会像255那么高:

struct Age(u8);

struct Player {
age: Option<Age>,
}

我希望能够将此约束通知优化器 - Age永远不可能是255 ,因此可以安全地将该位模式用作 None .这可能吗?

最佳答案

从 Rust 1.28 开始,您可以使用 std::num::NonZeroU8 (和 friend )。这充当一个包装器,告诉编译器数字的内容将永远包含文字零。这也是为什么 Option<Box<T>>是指针大小的。

这里有一个例子展示了如何创建一个 Age并读取其有效负载。

use std::num::NonZeroU8;

struct Age(NonZeroU8);

impl Age {
pub fn new(age: u8) -> Age {
let age = NonZeroU8::new(age).expect("Age cannot be zero!");
Age(age)
}

pub fn age(&self) -> u8 {
self.0.get()
}
}

struct Player {
age: Option<Age>,
}

fn main() {
println!("size: {}", std::mem::size_of::<Player>());
// Output: size: 1
}

关于optimization - 我可以将 "null pointer optimization"用于我自己的非指针类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30414068/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com