我有一段代码,它基本上为数组的所有元素添加了一些常数
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;
第二种解决方案对我来说看起来最易读,但与第一种选择相比,我是否需要支付罚金。是否有任何标准编译器会在编译时预先计算?
我目前正在使用 gcc 4.6.3,但由于对旧代码的某些依赖,我没有使用 C++11。
更新:
根据我对汇编输出的有限了解,我会说编译器没有优化它。即使使用 -std=c++0x 标志,情况也是一样的。
以下是汇编输出:
硬编码文字(见第 26 行)
更新2
无论是否使用 -std=c++0x 标志,使用 -O2 标志都会产生相同的汇编文件。
结论
由于像 -O2 这样的优化标志可以完成正确的工作,因此 Method2 可能是最佳实践。此外,由于这些代码现在是类成员方法的一部分,我最终使用了一个私有 const 变量初始化为std::numeric_limits<MyMatrix::Scalar>::max()/2 + 1