用C ++编写简单数学表达式的时间优化

时间:2014-04-01 03:24:59

标签: c++ compile-time-constant numeric-limits

我有一段代码,它基本上为数组的所有元素添加了一些常数

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变量

1 个答案:

答案 0 :(得分:1)

以前,您可以将某些内容声明为const,并且有人可以覆盖它的const,因此编译器可能没有优化您的代码。使用C ++ 11,您可以声明一些constexpr,其中说“是的,这是一个常量,您可以在编译时使用它”。这意味着任何带有constexpr参数的constexpr函数都可以在编译时进行评估。

那么这在您的特定情况下意味着什么?如果您正在使用C ++ 11(我强烈推荐),那么当函数std::numeric_limits<unsigned short int>::max()被声明为constexpr时,它将在编译时进行优化。

启用c ++ 11通常就像设置编译器标志一样简单。