В руководстве 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?
, мы также делаем чек; однако мы добавляем некоторые накладные расходы в случае, если условие не выполняется. Я что-то пропустил?