【问题标题】:fastest multi-type array solution?最快的多类型阵列解决方案?
【发布时间】:2011-06-30 08:05:22
【问题描述】:

我需要对可以存储混合类型数据(包括各种类型的指针)的瞬态数组(在堆栈上和/或在堆中)进行高性能迭代。

我想过使用联合来确定几个受支持的数组成员的最大大小。

以下是最快(安全)的架构和解决方案吗?

union array_sizer {
    void *(* funcPtr)();
    void *dataPtr;
    struct {int i} *strPtr;
    int intVal;
    float floatVal;
}

// create an array of 10 item *pairs*.
union array_sizer *myArray = malloc(22 * sizeof(union array_sizer));

// fill up the (null-terminated) array 

// then, knowing that every *even* item is an int...
for(int i=0; myArray[i].intVal; i+=2){
    //(... do something in loop ...)
}

数组数据将由强制数据完整性的函数创建,因此 for 循环在除空终止之外的错误检查方面可能非常少。

【问题讨论】:

  • 没关系。不过,请考虑完全抽象您的数组,使用函数来访问联合并返回适当的类型。
  • 对的第二个值的类型,是从对的第一个值的含义推断出来的。在第一个值的枚举上使用 switch 查找将非常精简。
  • 抽象是个好主意,但在这种情况下,我真的要追求性能。

标签: c arrays performance pointers primitive-types


【解决方案1】:

我会创建一个并行的“查找表”,它索引原始数组以说明它是什么类型。因此,创建一个表示类型的枚举并使其成为相应的数组。

但是,如果您以这种方式查看性能,则会出现页面错误和缓存未命中,因为这两个数组很可能位于不同的页面上。因此,要解决这个问题,您想要做的不是“数组结构”,而是创建一个“结构数组”。为此,请创建一个具有 2 个成员的结构:枚举类型常量和数据本身。如果这样做,当我们获取索引时,它将确保数据和相应的类型信息在同一页面上。

从高级设计的角度来看,这将是我的首选方法。

【讨论】:

  • 好的,所以基本上,您只需将上述联合包装在具有 .type 成员的结构中?如果是这样,则不需要这样做,因为类型信息隐式绑定到数组值对中第一个值的含义。
猜你喜欢
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 2020-07-22
相关资源
最近更新 更多