Оптимизация компилятора и увеличение - PullRequest
2 голосов
/ 08 ноября 2010

Приводит ли оптимизация компилятора к такому коду? В частности, можно ли ответить на автоинкременты для оценки в правильном порядке?

uint result = (array[i++] << 16) | (array[i++] << 8) | array[i++];

Ответы [ 2 ]

4 голосов
/ 08 ноября 2010

Да; это указано .

В спецификации написано :

Операнды в выражении оценивается слева направо. За Например, в F(i) + G(i++) * H(i), метод F вызывается с использованием старого значения i, то метод G вызывается с старое значение i и, наконец, метод H вызывается с новым значением i. Это отдельно от и не связано с приоритет оператора.

0 голосов
/ 08 ноября 2010

Нет, я думаю, что вы модифицируете объект (i) несколько раз между точками последовательности.IIRC ни поразрядно, ни, ни индексация массива не являются точками последовательности.Вам разрешено изменять объект только один раз, иначе не определено или неопределенное поведение.

ПРИМЕЧАНИЕ.Это не обязательно проблема, связанная с оптимизатором, это просто не разрешено законом.

Редактировать: вот ссылка на точки последовательности - http://msdn.microsoft.com/en-us/library/d45c7a5d(VS.80).aspx

...