创建具有相同布局和利基但没有 Drop impl 的类型

问题描述 投票:0回答:1

我今天遇到了以下问题:

use std::mem::{size_of, MaybeUninit};

struct Foo<'a> {
    foo: &'a i32,
}


fn main() {
    println!("{}", size_of::<Option<Foo>>());              // 8
    println!("{}", size_of::<Option<MaybeUninit<Foo>>>()); // 16 (!)
}

因此,尽管

#[repr(transparent)]
MaybeUninit
可能会产生“副作用” 类型布局,因为它显然抑制了利基优化。

有没有办法让我创建一个没有这个问题的类型,比如说

PhantomSlot<T>

我需要一种类型

  • T
  • 具有相同的尺寸、对齐方式和壁龛
  • 永远不会实现
    Drop
    ,无论T如何
rust unsafe abi memory-layout
1个回答
1
投票

这叫

ManuallyDrop
:

use std::mem::{size_of, ManuallyDrop};

struct Foo<'a> {
    foo: &'a i32,
}

fn main() {
    println!("{}", size_of::<Option<Foo>>());              // 8
    println!("{}", size_of::<Option<ManuallyDrop<Foo>>>()); // 8
}
© www.soinside.com 2019 - 2024. All rights reserved.