В руководстве GCC (версия 4.8.2) указано следующее:
-ftree-loop-if-convert-stores:
Попытка также выполнить if-convert условные прыжки, содержащие память пишет. Это преобразование может быть небезопасным для многопоточных программ, поскольку он преобразует условную память в записывается безусловная память. Например,for (i = 0; i < N; i++) if (cond) A[i] = expr;преобразуется в
for (i = 0; i < N; i++) A[i] = cond ? expr : A[i];потенциально создавая расы данных.
Интересно, однако, если есть усиление производительности, используя оператор operator? по сравнению с if.
- В первом фрагменте кода
A[i]устанавливаетсяexprтолько, если условие выполнено. Если это не выполняется, то код внутри оператора пропускается. - Во втором,
A[i], кажется, записано независимо от условия; условие влияет только на значение, на которое оно установлено.
Используя operator?, мы также делаем чек; однако мы добавляем некоторые накладные расходы в случае, если условие не выполняется. Я что-то пропустил?