repr(C)如何在Rust中对零大小的类型进行操作?

iecba09b  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(108)

我遇到过this post,它解释了C中的结构体不能为零大小,必须至少有一个命名字段才不会出现未定义行为。但是,在Rust中,我们可以有这样的结构。我们也可以将结构体标记为#[repr(C)],从the docs开始,“做C做的事情”。
所以很自然地,我去了操场尝试this

#[repr(C)]
struct ZeroSized;

fn main() {
    println!("Size: {}", std::mem::size_of::<ZeroSized>());
}

这段代码会输出0。
我想知道Rust是否允许#[repr(C)]零大小的结构,如果它们在C中被禁止,甚至UB?这样一个结构体的最终大小实际上是0吗?如果我在内存中复制这个结构会发生什么?能给我个指针吗

nc1teljy

nc1teljy1#

我建议你在documentation on repr中进一步阅读
ZST仍然是零大小的,即使这不是C中的标准行为,并且明显地与C++中空类型的行为相反,后者表示它们仍然应该消耗一个字节的空间。
回答您的问题:
我想知道Rust是否允许#[repr(C)]零大小的结构体,如果它们在C中被禁止,甚至UB?这样一个结构体的最终大小实际上是0吗?
是的,是的,见上文。
如果我在内存中复制这个结构会发生什么?
与任何ZST一样,编译器最有可能是omit the copies
能给我个指针吗
与任何ZST yes一样。

相关问题