Я пишу небольшую специализированную библиотеку C99 для графиков, и я часто получаю циклы вида:
for(int i = 0; i < graph->nvertices; ++i) {
// ...
}
Мне интересно, хорошая ли это практика, особенно в случае узкой петли.Сначала я подумал, что компилятор будет достаточно умен, чтобы смотреть на 'graph-> nvertices' только один раз, вместо того, чтобы рассматривать его на каждой итерации, но это кажется невозможным, поскольку graph-> nvertices может меняться внутри цикла.Это умнее и быстрее писать:
const int N = graph->nvertices;
for(int i = 0; i < N; ++i) {
// ...
}
Кажется быстрее, так как не нужно смотреть на указатель более одного раза, но требует создания новой переменной.
Примечание: я полагаю, что в такой ситуации приятно иметь возможность прочитать небольшой ассемблерный код, чтобы увидеть, что на самом деле делает компилятор, если у кого-то есть хорошая ссылка, я открыт для предложений.