"struct hack"可以这样实现吗?

Can "struct hack" be implemented this way?

本文关键字:实现 struct hack      更新时间:2023-10-16

Struck hack用于分配比结构本身初始需要更多的内存,以便您可以引用数组的越界部分,这样您就可以留在实际分配的内存中。

这是它的工作原理。

struct Foo
{
  // ..
  size_t size;
  int data[1];
};
const size_t SIZE = 100;
Foo *p = (Foo*) malloc(sizeof(Foo) + sizeof(int) * (SIZE - 1));
p->size = SIZE;
for (int i = 0; i < p->size; ++i) (p->data)[i] = i;

问题:

我们可以使用单个整数而不是大小为1的数组吗?如果这是可行的,那么为什么数组大小为1的版本变得更受欢迎呢?

struct Foo
{
  // ..
  size_t size;
  int data;
};
// ..
for (int i = 0; i < p->size; ++i) (&p->data)[i] = i;

在数组的边界之外访问数组是未定义的行为。例如,调试器可能决定在数组的每一边插入金丝雀数组。

明智的做法是使用std::vector,这就是它的作用。

struct hack是一个老的C-ism,在c++中是多余的。

对于第二个版本,您无法使用美观的直接数组语法。你不能做

p->data[i]

,但必须做

(&p->data)[i]

因为写p->data[i]比写(&p->data)[i]更方便。

因为p->data[i](&p->data)[i]更短更易读