如何以缓存友好的方式访问灵活数组的数组?

How to access array of flexible arrays in cache friendly manner?

我有 records 灵活的数组成员

typedef struct record {
    unsigned foo;
    signed bar;
    double number[];
} record;

我有多个 records,其中 numbers 的数量相同,所以我可以将它们排列成数组。我想将它们分配到一个连续的内存中 space.

const unsigned numbers = ...;
const unsigned records = ...;
const size_t record_size = sizeof(record) + numbers*sizeof(double);
record *prec = malloc(records*record_size);

所以现在我知道 record_size 并且我可以访问它,但是最佳实践是如何通过给定的 record 索引正确和安全地执行它?

当我将包含 foobar 以及 numbers 的 header 分开时,我可以这样做,但我想将 record 放在一起缓存一致性。

由于只有您知道实际的布局,C 编译器无法帮助您。因此,您必须自己进行地址计算。这将需要一些强制转换才能在字节级别进行指针运算:

record * get_record(record *base, size_t numbers, size_t index)
{
  return (record *) ((unsigned char *) base +
                    index * (sizeof *base + numbers * sizeof *base->number));
}

鉴于以上(和您的代码);您可以像这样访问数组:

record *first = get_record(base, numbers, 0);
first->foo = 4711;
record *second = get_record(base, numbers, 1);
second->foo = 17;

一个明显的缺点是您将不得不保留 numbers 值。这可以通过使用显式 "base" 结构对整个数组建模来改进,该结构包含每个元素的大小和基址指针。当然它可以与元素本身共同分配以将它们保持在一起并减少所涉及指针的距离。

此外,please don't cast the return value of malloc() in C