0

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

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 标志,情况也是一样的。

以下是汇编输出:

使用带有 -std=c++0x 标志的方法 2

硬编码文字(见第 26 行)

更新2

无论是否使用 -std=c++0x 标志,使用 -O2 标志都会产生相同的汇编文件。

结论

由于像 -O2 这样的优化标志可以完成正确的工作,因此 Method2 可能是最佳实践。此外,由于这些代码现在是类成员方法的一部分,我最终使用了一个私有 const 变量初始化为std::numeric_limits<MyMatrix::Scalar>::max()/2 + 1

4

1 回答 1

1

以前你可以声明一些东西const,有人可以覆盖它,const所以编译器可能没有优化你的代码。使用 C++11,您可以声明constexpr“是的,确实,这是一个常量,您可以在编译时使用它”。这意味着任何constexprconstexpr参数的函数都可以在编译时进行评估。

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

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

于 2014-04-01T03:44:51.613 回答