Мой вопрос касается следующей конструкции:
uint16_t flag = 0x1f;
while (curCase) {
if ((curCase->i == i) && (curCase->j == j)) flag ^= 0x10;
if ((curCase->i == i-1) && (curCase->j == j)) flag ^= 0x01;
if ((curCase->i == i) && (curCase->j == j+1)) flag ^= 0x02;
if ((curCase->i == i+1) && (curCase->j == j)) flag ^= 0x04;
if ((curCase->i == i) && (curCase->j == j-1)) flag ^= 0x08;
if (!(flag ^ 0xf0)) return; // if none of the neighbors are candidates (ignore first bits)
curCase = curCase->suiv;
}
curCase - это просто элемент связанного списка с 2 атрибутами int i и j и следующим элементом suiv;
Зная, что моя программа работает в одном потоке, и поэтому указанные значения не могут измениться во время итерации while;
Мне было интересно, был ли компилятор достаточно умен (и я предполагаю, что ответ - да, но я ' хотелось бы быть уверенным) обнаружить, что код требует для вычисления указателей curCase-> i и curCase-> j 5 раз, когда я мог просто объявить 2 временных указателя и присвоить curCase-> i и curCase-> j в начале цикла;
И в более общем плане, если он обнаруживает переменные, которые рассчитываются более одного раза и, следовательно, оптимизируются.
Я тестировал списки разных размеров с обоими вариантами, и я не стал нашел один намного быстрее другого.