我有一段代码,它基本上为数组的所有元素添加了一些常数
Matrix a.array() += 32768; //Bad due to hard coded literal
Matrix的标量类型为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标志,故事也是如此。
以下是装配输出:
Using Method 2 with -std=c++0x flag
Hardcoded Literal(见第26行)
UPDATE2
使用-O2标志产生相同的汇编文件,而不管-std = c ++ 0x flag是否使用。
结论
由于像-O2这样的优化标志可以完成正确的工作,因此Method2可能是最佳实践。此外,由于这些代码现在是类成员方法的一部分,我最终使用初始化为std::numeric_limits<MyMatrix::Scalar>::max()/2 + 1
的私有const变量
答案 0 :(得分:1)
以前,您可以将某些内容声明为const
,并且有人可以覆盖它的const
,因此编译器可能没有优化您的代码。使用C ++ 11,您可以声明一些constexpr
,其中说“是的,这是一个常量,您可以在编译时使用它”。这意味着任何带有constexpr
参数的constexpr
函数都可以在编译时进行评估。
那么这在您的特定情况下意味着什么?如果您正在使用C ++ 11(我强烈推荐),那么当函数std::numeric_limits<unsigned short int>::max()
被声明为constexpr
时,它将在编译时进行优化。
启用c ++ 11通常就像设置编译器标志一样简单。