Трюки от Криса Крис Касперски Хакер, номер #091, стр. 091-132-3 int a[10][20][30]; void example (void) { int i, j, k; for (k = 0; k < 10; k++) for (j = 0; j < 10;j++) for (i = 0; i < 10; i++) a[i][j][k] = 1; } Грамотный оптимизатор должен переписать его так: int a[10][20][30]; void example (void) { int i, j, k; register int (*p)[20][30]; for (k = 0; k < 10; k++) for (j = 0; j < 10; j++) for (p = (int (*)[20][30]) &a[0][j][k], i = 0; i < 10; i++) *(p++[0][0]) = 1; } Эксперимент показывает, что ни Microsoft Visual C++, ни GCC не выполняют регистровых реассоциаций ни в сложных, ни даже в простейших случаях. С приведенным примером справился один лишь Intel C++, да и то лишь частично, поэтому в критических к производительности случаях оптимизировать код необходимо вручную. |