У меня есть кусок кода, который в основном добавляет некоторое постоянное число ко всем элементам массива
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
Ранее вы могли бы объявить что-то как const
и кто-то может отменить это const
Так что компилятор, возможно, не оптимизировал ваш код. С C ++ 11 вы можете объявить что-то constexpr
который говорит: «Да, действительно, это константа, и вы можете использовать ее во время компиляции». Это означает, что любой constexpr
функции с constexpr
аргументы могут быть оценены во время компиляции.
Так что это значит в вашем конкретном случае? Если вы используете C ++ 11 (что я очень рекомендую), то в качестве функции std::numeric_limits<unsigned short int>::max()
объявлен как constexpr
он будет оптимизирован во время компиляции.
Включение c ++ 11 обычно так же просто, как установка флага компилятора.
Других решений пока нет …