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

C++ C+中的函数调用常量传播+;,c++,c++11,constants,call,constexpr,C++,C++11,Constants,Call,Constexpr,我无法通过搜索找到答案,所以下一步就是提问。假设我有如下代码: template<class Int> inline Int onbit(Int value, int n) { return value | (static_cast<Int>(1) << n); } 模板 内联Int onbit(Int值,Int n){ 返回值|(static_cast(1)在最可能的情况下,它应该在调用Onbit(A,4)的地方执行即使是以您提供的代码形式。但是,同样

我无法通过搜索找到答案,所以下一步就是提问。假设我有如下代码:

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

返回值|(static_cast(1)在最可能的情况下,它应该在调用Onbit(A,4)的地方执行即使是以您提供的代码形式。但是,同样,我们只能希望编译器能够做到。您无法确定优化是否会完成。标准已经让编译器的实现按照他们想要的方式来做。

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

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

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


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

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

模板化函数并不意味着编译器将内联它。内联模板生成的代码取决于编译器(如果您确信您比编译器思考得更好,您应该能够使用特定于编译器的扩展来重写它)

但是,如果您正在考虑强制执行常量传播和内联扩展的组合,我建议您使用宏。在C/C++中,实际上没有其他任何东西能够以一种跨平台的方式实现内联和常量传播的组合

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

#定义位(v,n)((v)第1条你是否试着查看编译器生成的代码?在现代编译器中,常数折叠是相当普遍的。我怀疑这是否重要,无论你是做<代码> n>代码>模板参数还是非。纯邪恶=宏,它包含了其他C++关键字,如<代码>返回<代码>,并且不能被识别为宏原因,它不HA。我有一个典型的大写字母()。你的宏没有像OPs
onBit
函数那样做。啊……对不起,更正了我的帖子。但我坚持我的(现实的)解决方案。你没有更正你的帖子,你仍然把一个邪恶的宏伪装成一个正常的函数。