самое быстрое решение для нескольких типов массивов? - PullRequest
0 голосов
/ 30 июня 2011

Мне нужна высокопроизводительная итерация для переходных массивов (в стеке и / или в куче), которые могут хранить смешанные типы данных, включая различные типы указателей.

Я думал об использовании объединений для определения наибольшего размераиз нескольких поддерживаемых членов массива.

является следующим, самая быстрая (безопасная) архитектура и решение?

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 ...)
}

данные массива будут созданы из функций, которые обеспечивают целостность данных, поэтому дляцикл может быть довольно скудным при проверке ошибок после нулевого завершения.

1 Ответ

0 голосов
/ 30 июня 2011

Я бы создал параллельную «справочную таблицу», которая индексирует исходный массив, чтобы сказать, что это за тип.Поэтому создайте перечисление, представляющее типы, и создайте для него соответствующий массив.

Однако, если вы посмотрите на производительность, если вы сделаете это таким образом, вы получите сбой страницы и пропадание кэша, потому что, вероятно, будут работать 2 массиваразные страницы.Таким образом, чтобы обойти это, то, что вы хотите сделать, это вместо «структуры массивов» создать «массив структур».Для этого создайте структуру, которая имеет 2 члена: константу типа enum и сами данные.Если вы сделаете это, когда мы получим индекс, он будет гарантировать, что данные и информация о соответствующем типе будут на одной странице.

Это мой предпочтительный метод с точки зрения проектирования высокого уровня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...