1

我无法通过搜索找到答案,所以下一步是询问。假设我有一些这样的代码:

template<class Int>
inline Int onbit(Int value, int n) {
  return value | (static_cast<Int>(1) << n);
}

如果我像这样调用代码,onbit(A, 4)常量4会被传播并优化,还是应该将其设为模板 ( template<int n, class Int>) 以使其成为常量。这里是否需要 C++0x constexpr,如果需要,我应该如何使用它(应该int n是 const 还是 constexpr?)。

我知道 constexpr 可以使用常量参数,但是如果部分参数是常量而部分是可变的,它会部分优化吗?

总结:一个函数(它必须是内联的,对吗?)是否可以通过常量传播进行部分优化,如果可以,这样做的要求是什么?

即使在我写这篇文章的时候,我也在想一个内联函数调用会传播常量......

4

3 回答 3

4

您不能保证所有编译器都会优化此代码,尽管大多数现代编译器(MSVC 和 gcc)至少在大多数情况下(取决于上下文)会在不考虑 const 的情况下进行优化,因为函数是如此简单。

另一方面,当您使用 const 时,您不能保证任何编译器都会严格优化它。

因此,如果优化对您很重要,那么在所有情况下,唯一的答案是 - 在重要的情况下检查您的程序集。您的编译器可能会在一个文件中对其进行优化,但不会在另一个文件中进行优化(例如,当在一个复杂的模板内部调用此函数时,尽管不太可能您的编译器的优化器会放弃并且在某些情况下不对其进行优化)。

我相信只有在编译时检查需要 const 时才应该依赖它,而在运行时效率需要时应该依赖检查生成的程序集。

于 2011-08-01T17:15:25.337 回答
1

在最可能的情况下,是的,它应该在您调用 Onbit(A,4) 的地方执行此操作,即使以您提供代码的形式也是如此。然而,再一次,我们只能希望编译器能做到这一点。您无法确定优化会完成。标准已将其留​​给编译器的实现以按照他们想要的方式进行。

于 2011-08-01T16:58:54.247 回答
-3

您需要将 int n 添加到模板参数以强制执行“不断传播”。请记住,您将为使用不同的 n 作为模板参数调用 onbit() 的每个地方生成新的机器代码(我想如果您传播常量,您将不得不忍受)。

模板化一个函数并不意味着编译器内联它。由编译器来内联从模板生成的代码(如果您确定自己比编译器思考得更好,您应该能够使用编译器特定的扩展来覆盖它)。

但是,如果您正在考虑强制执行常量传播和内联扩展的组合,我建议您使用宏。在 C/C++ 中确实没有其他东西可以让您以一种跨平台的方式将内联和常量传播结合起来。

#define ON_BIT(v,n) ((v) | 1 << (n))

或类似的东西。我知道使用宏是邪恶的......但我想你还是个坏孩子,考虑过早的优化:)。

于 2011-08-01T17:17:18.380 回答