我需要对瞬态数组(在堆栈和/或堆中)进行高性能迭代,它可以存储混合类型的数据,包括各种类型的指针。
我想过使用联合来确定几个支持的数组成员的最大大小。
以下是最快(安全)的架构和解决方案?
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循环在错误检查超出空终止时可能非常吝啬。
答案 0 :(得分:0)
我会创建一个并行的“查找表”,它将索引到原始数组中以说明它是什么类型。因此,创建一个表示类型的枚举,并使其成为相应的数组。
但是,如果你以这种方式查看性能,你会得到页面错误和缓存未命中,因为2个数组可能会在不同的页面上。因此,为了解决这个问题,您需要做的是“数组结构”而不是“结构数组”。为此,创建一个包含2个成员的结构:枚举类型常量和数据本身。如果这样做,当我们获取索引时,它将确保数据和相应的类型信息将在同一页面上。
从高级设计的角度来看,这是我首选的方法。