可以通过这种方式实现"struct hack"吗?

Eri*_*c Z 6 c++ struct

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;
Run Code Online (Sandbox Code Playgroud)

题:

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

struct Foo
{
  // ..
  size_t size;
  int data;
};

// ..
for (int i = 0; i < p->size; ++i) (&p->data)[i] = i;
Run Code Online (Sandbox Code Playgroud)

Pup*_*ppy 8

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

聪明的做法就是使用a std::vector,这就是它的用途.struct hack是一个旧的C-ism,在C++中是多余的.

  • 有一点是`std :: vector`强制进行额外的分配(在某些情况下这可能是不合需要的,例如在性能方面).你知道C++方法只为结构及其数组分配一块内存吗? (2认同)

mar*_*arc 7

对于第二个版本,您无法使用漂亮的直接阵列synatx.你做不到

p->data[i]
Run Code Online (Sandbox Code Playgroud)

不再需要做了

(&p->data)[i]
Run Code Online (Sandbox Code Playgroud)

什么看起来更难看.


Sta*_*tan 5

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