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