c++ - C++中的函数调用常量传播

标签 c++ c++11 constants call constexpr

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

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 可以使用常量参数,但是如果部分参数是常量而部分是可变的,它会被部分优化吗?

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

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

最佳答案

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

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

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

我认为您应该仅在编译时检查需要时才依赖 const,而在运行时效率需要时您应该依赖检查生成的程序集。

关于c++ - C++中的函数调用常量传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6901745/

相关文章:

c++ - 如何找到我的阵列使用的内存

c++ - 如何使一个函数的返回类型与另一个函数的返回类型相同?

c++ - 为什么 getline() 不接受常量 istream?

c++ - 你如何循环读取 C++ 套接字?

c++ - 关于存储类去向

c++ - C++ 中的原子操作

c++ - 模板函数错误, "no matching function for call to..."

c++ - 在 C++ 中更改 const 值的方法

C++:用 const 成员替换类数组的元素

c++ - 比 GetPixel() 更快?