如何在Rust中实现C flexible数组成员模式?

kir*_*gan 11 struct rust

我想在Rust中使用灵活的数组成员(有时称为struct hack)来实现这个C代码:

struct test {
  int key;
  int dataSize;
  int data[];
};
Run Code Online (Sandbox Code Playgroud)
struct test* t = malloc(sizeof(struct test) + sizeOfData)
Run Code Online (Sandbox Code Playgroud)

结构末尾的空数组允许您一次性分配元字段和数据.不幸的是,我无法弄清楚如何在Rust中做这样的事情.

mca*_*ton 2

该结构的 Rust 等效项将使用切片:

struct test {
  key: i32,
  dataSize: i32,
  data: [i32],
}
Run Code Online (Sandbox Code Playgroud)

然而,这些类型目前使用起来并不方便,因为没有安全的方法来构造它们。

更实用的方法是使用泛型:

struct test<T: ?Sized> {
  key: i32,
  dataSize: i32,
  data: T,
}
Run Code Online (Sandbox Code Playgroud)

然后确保仅在 是 数组或切片test时使用T(只能通过强制创建)。

也可以看看:

  • @JL2210 胖指针是一个指针+一些额外的数据,例如“&amp;[T]”是一个胖指针,因为它包含第一个元素的地址+大小,而“&amp;dyn Trait”是一个胖指针,因为它包含一个指向数据的指针+一个指向vtable的指针。 (3认同)