repr(C) 在 Rust 中的零大小类型上表现如何?

Luc*_*que 4 c rust

我看到这篇文章解释了 C 中的结构体大小不能为零,并且必须至少有一个命名字段才不会出现未定义的行为。然而,在 Rust 中,我们可以拥有这样的结构。我们还可以#[repr(C)]文档中将结构标记为“做 C 所做的事情”。

所以很自然地,我去操场尝试这个

#[repr(C)]
struct ZeroSized;

fn main() {
    println!("Size: {}", std::mem::size_of::<ZeroSized>());
}
Run Code Online (Sandbox Code Playgroud)

这段代码确实打印出了 0。

我想知道#[repr(C)]如果在 C 中禁止使用零大小的结构,Rust 是否允许它们,甚至是 UB?这样一个结构体的最终大小实际上会是 0 吗?如果我在内存中复制这个结构会发生什么?我什至可以有一个指向它的指针吗?

caf*_*e25 6

我建议您进一步阅读有关 repr 的文档

ZST 的大小仍然为零,尽管这不是 C 中的标准行为,并且与 C++ 中空类型的行为明显相反,后者表示它们仍应消耗一个字节的空间。

回答您的问题:

我想知道 Rust 是否允许 #[repr(C)] 零大小的结构(如果在 C 中被禁止的话),甚至是 UB?这样一个结构体的最终大小实际上会是 0 吗?

是的,是的,见上文。

如果我在内存中复制这个结构会发生什么?

与任何 ZST 一样,编译器很可能会忽略副本

我什至可以有一个指向它的指针吗?

与任何 ZST 一样,是的