如何在内存中连续分配可变大小的结构?

Jim*_*ker 3 c++ memory-management placement-new

我正在使用C++,我有以下结构:

struct ArrayOfThese {
  int a;
  int b;
};

struct DataPoint {
  int a;
  int b;
  int c;
};

在内存中,我想在每个DataPoint的末尾有一个或多个ArrayOfThese元素.每个DataPoint并不总是具有相同数量的ArrayOfThese元素.

因为我有一些荒谬的DataPoints要组装然后通过网络流,我希望我的所有DataPoints和它们的ArrayOfThese元素是连续的.为固定数量的ArrayOfThese元素浪费空间是不可接受的.

在C中,我会在DataPoint的末尾创建一个声明为的ArrayOfThese d[0];元素,为我所拥有的多个ArrayOfThese元素分配一个DataPoint加上足够的额外字节,并使用虚拟数组索引它们.(当然,ArrayOfThese元素的数量必须在DataPoint的字段中.)

在C++中,正在使用placement new和相同的0-length数组破解正确的方法?如果是这样,放置新保证后续从同一内存池调用new会连续分配吗?

R S*_*hko 5

由于您正在处理没有构造函数的普通结构,因此可以恢复为C内存管理:

void *ptr = malloc(sizeof(DataPoint) + n * sizeof(ArrayOfThese));
DataPoint *dp = reinterpret_cast<DataPoint *>(ptr));
ArrayOfThese *aotp = reinterpet_cast<ArrayOfThese *>(reintepret_cast<char *>(ptr) + sizeof(DataPoint));
Run Code Online (Sandbox Code Playgroud)