gpt4 book ai didi

pointers - 如何以字节为单位获取枚举成员的指针偏移量?

转载 作者:行者123 更新时间:2023-11-29 07:58:48 25 4
gpt4 key购买 nike

对于结构成员,可以计算出 offsetof在 Rust 中,类似于 C 的 offsetof

虽然这适用于结构字段,但我找不到与如何对枚举及其变体成员执行此操作等效的方法。

通过在 IRC 上与开发人员交谈,不能保证枚举的所有成员都对齐:

如何计算枚举成员的偏移量?


对于实例,它可以像这样工作:

enum Test { A(u8), B(f64) };

fn test_me(a: Test) {
if let Test::A(b) = a {
// we could find the offset between 'a' and 'b' here.
// but how to do this without instantiating variables?
println("{}", (b as *const _) as usize - (a as *const _) as usize);
}
}

然而,目标是能够通过仅检查类型来做到这一点,因此它可以编译为常量,例如:

println("{}", offset_of_enum!(Test, A));

在尝试为此编写宏时,我在通过 :: 连接参数时遇到了问题,所以我不确定如何解决该部分。

最佳答案

枚举变体与结构字段有很大不同。枚举变体没有不同于枚举类型的唯一类型。即使在 Rust 编译器内部,枚举变体也被表示为包括枚举的判别式。这意味着枚举变体相对于枚举本身的偏移量为零。

您更有可能需要枚举变量字段的偏移量。由于获得对枚举变体字段的引用的唯一方法是匹配枚举的值,因此您需要一个有效的枚举值来匹配,因此您不能使用结构字段偏移量中使用的空指针技巧计算。

macro_rules! offset_of {
($($tt:tt)*) => {
{
let base = $($tt)*(unsafe { ::std::mem::uninitialized() });
let offset = match base {
$($tt)*(ref inner) => (inner as *const _ as usize) - (&base as *const _ as usize),
_ => unreachable!(),
};
::std::mem::forget(base);
offset
}
}
}
enum Foo {
A(i32),
B(u8),
}
let offset = offset_of!(Foo::A);

留给读者为具有多个字段的枚举结构变体和枚举元组变体实现此宏。

关于pointers - 如何以字节为单位获取枚举成员的指针偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41823321/

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