Когда вам нужна эффективность, иногда ясность кода выходит из окна:)
Сначала нужно убедиться, что вы хотите повысить эффективность - у вас есть информация о профилировании, чтобы убедиться, что простой код сравнения слишком неэффективен для вас?
Вы можете просто рассматривать его как массив байтов одинакового размера. memcmp
делает сравнения произвольной памяти:
Структура данных, такая как:
int matrix[2][2];
хранится так же, как:
int matrix[2*2];
, который может быть динамически выделен как:
typedef int matrix[2*2];
matrix* m = (matrix*)malloc(sizeof(matrix));
Я не предлагаю вам динамически распределять их, я иллюстрирую, как байты в вашем исходном типе фактически располагаются в памяти.
Следовательно, действует следующее:
matrix lookup[16];
int matrix_cmp(const void* a,const void* b) {
return memcmp(a,b,sizeof(matrix));
}
void init_matrix_lookup() {
int i;
for(i=0; i<16; i++) {
...
}
qsort(lookup,16,sizeof(matrix),matrix_cmp));
}
int matrix_to_lookup(matrix* m) {
// in this example I'm sorting them so we can bsearch;
// but with only 16 elements, its probably not worth the effort,
// and you could safely just loop over them...
return bsearch(m,lookup,16,sizeof(matrix),matrix_cmp);
}