Оптимизация времени компиляции простых математических выражений в Stack Overflow

У меня есть кусок кода, который в основном добавляет некоторое постоянное число ко всем элементам массива

Matrix a.array() += 32768; //Bad due to hard coded literal

Матрица имеет скалярный тип unsigned short int,
Некоторые другие варианты, которые я изучаю, следующие:

Matrix a.array() += std::numeric_limits<Matrix::Scalar>::max()/2 + 1;

а также

Matrix a.array() += (std::numeric_limits<Matrix::Scalar>::max() >> 1) + 1;

Второе решение выглядит наиболее читабельным для меня, но я плачу по сравнению с 1-м вариантом. Любой стандартный компилятор будет предварительно вычислять это во время компиляции?

В настоящее время я использую gcc 4.6.3, но я не использую C ++ 11 из-за некоторых зависимостей от старого кода.

Обновить:

Из моих ограниченных знаний о выводе сборки я скажу, что компилятор не оптимизирует его. История такая же, даже с флагом -std = c ++ 0x.

Вот результаты сборки:

Использование метода 2 с флагом -std = c ++ 0x

Закодированный буквальный (См. Строку 26)

Update2

Использование флагов -O2 создает идентичные файлы сборки независимо от того, используется флаг -std = c ++ 0x или нет.

Заключение

Поскольку флаги оптимизации, такие как -O2, делают правильную работу, метод2, вероятно, является лучшей практикой. Кроме того, поскольку эти коды теперь являются частью методов-членов класса, я использовал закрытую переменную const, инициализированную для std::numeric_limits<MyMatrix::Scalar>::max()/2 + 1

0

Решение

Ранее вы могли бы объявить что-то как const и кто-то может отменить это constТак что компилятор, возможно, не оптимизировал ваш код. С C ++ 11 вы можете объявить что-то constexpr который говорит: «Да, действительно, это константа, и вы можете использовать ее во время компиляции». Это означает, что любой constexpr функции с constexpr аргументы могут быть оценены во время компиляции.

Так что это значит в вашем конкретном случае? Если вы используете C ++ 11 (что я очень рекомендую), то в качестве функции std::numeric_limits<unsigned short int>::max() объявлен как constexpr он будет оптимизирован во время компиляции.

Включение c ++ 11 обычно так же просто, как установка флага компилятора.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]