我看到这篇文章解释了 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 吗?如果我在内存中复制这个结构会发生什么?我什至可以有一个指向它的指针吗?
我建议您进一步阅读有关 repr 的文档
ZST 的大小仍然为零,尽管这不是 C 中的标准行为,并且与 C++ 中空类型的行为明显相反,后者表示它们仍应消耗一个字节的空间。
回答您的问题:
我想知道 Rust 是否允许 #[repr(C)] 零大小的结构(如果在 C 中被禁止的话),甚至是 UB?这样一个结构体的最终大小实际上会是 0 吗?
是的,是的,见上文。
如果我在内存中复制这个结构会发生什么?
与任何 ZST 一样,编译器很可能会忽略副本
我什至可以有一个指向它的指针吗?
与任何 ZST 一样,是的。
| 归档时间: |
|
| 查看次数: |
178 次 |
| 最近记录: |