gprof не работает должным образом в моей системе (MinGW), поэтому я хотел бы знать, какой из следующих фрагментов в среднем более эффективен.
Я знаю, что внутренне компиляторы C преобразуют все в арифметику указателей, но, тем не менее, я хотел бы знать, имеет ли какой-либо из следующих фрагментов какое-либо существенное преимущество перед другими.
Массив был динамически размещен в смежной памяти как 1d массив и может быть перераспределен во время выполнения (это для простой настольной игры, в которой игроку разрешено переопределять размер доски так часто, как он хочет).
Обратите внимание, что i & j должен вычисляться и передаваться в функцию set_cell () при каждой итерации цикла (gridType - это простая структура с несколькими целыми числами и указателем на другую структуру ячейки).
Заранее спасибо!
Выделить память
grid = calloc( (nrows * ncols), sizeof(gridType) );
Фрагмент # 1 (последовательно разобрать как 1D)
gridType *gp = grid;
register int i=0 ,j=0; // we need to pass those in set_cell()
if ( !grid )
return;
for (gp=grid; gp < grid+(nrows*ncols); gp++)
{
set_cell( gp, i, j, !G_OPENED, !G_FOUND, value, NULL );
if (j == ncols-1) { // last col of current row has been reached
j=0;
i++;
}
else // last col of current row has NOT been reached
j++;
}
Фрагмент # 2 (разбор как 2D-массив, используя только указатели)
gridType *gp1, *gp2;
if ( !grid )
return;
for (gp1=grid; gp1 < grid+nrows; gp1+=ncols)
for (gp2=gp1; gp2 < gp1+ncols; gp2++)
set_cell( gp2, (gp1-grid), (gp2-gp1), !G_OPENED, !G_FOUND, value, NULL );
Фрагмент # 3 (разобрать как 2D, используя только счетчики)
register int i,j; // we need to pass those in set_cell()
for (i=0; i<nrows; i++)
for (j=0; j<ncols; j++)
set_cell( &grid[i * ncols + j], i, j, !G_OPENED, !G_FOUND, value, NULL);
Свободная память
free( grid );
EDIT:
Я исправил # 2 формы gp1 ++) в gp1 + = ncols), в 1-м цикле, после поправки Пола (спасибо!)