C++ 编译器可以内联静态模板函子吗?
我读了以下问题: 我知道C++ 编译器可以内联静态模板函子吗?,c++,functor,C++,Functor,我读了以下问题: 我知道C++函子有什么好处。但我无法推断如果他做了以下事情会发生什么: template <typename T, unsigned int state> class Foo { public: static Foo_func() { /* Do something */ }; } // Partial specialization: // -- state == 1 template <typename T> class Foo <
C++函子
有什么好处。但我无法推断如果他做了以下事情会发生什么:
template <typename T, unsigned int state>
class Foo {
public:
static Foo_func() { /* Do something */ };
}
// Partial specialization:
// -- state == 1
template <typename T>
class Foo <T, 1> {
public:
static Foo_func() { /* Do something */ };
}
template <typename F>
void call_func(F func) {
// Do something... //
func();
// Do something... //
}
int main() {
Foo <double, /*state*/ 1> obj;
// Case 1:
call_func(obj.Foo_func);
// Case 2:
call_func(Foo<double, /*state*/ 1>::Foo_func);
}
模板
福班{
公众:
静态Foo_func(){/*做某事*/};
}
//部分专业化:
//--状态==1
样板
福班{
公众:
静态Foo_func(){/*做某事*/};
}
样板
无效调用函数(F func){
//做点什么//
func();
//做点什么//
}
int main(){
富奥比;
//案例1:
调用函数(obj.Foo函数);
//案例2:
调用_func(Foo::Foo_func);
}
在哪种情况下,编译器将能够内联Foo_func()
但我无法推断如果他做了以下事情会发生什么
不可能推断出会发生什么,你只要试试看就行了
内联是一种优化,而不是语言特性。它何时发生以及是否发生取决于您的编译器、它的版本、您如何配置它,以及调用站点(可能是内联的)周围的许多其他上下文
但我无法推断如果他做了以下事情会发生什么
不可能推断出会发生什么,你只要试试看就行了
内联是一种优化,而不是语言特性。它何时发生以及是否发生取决于您的编译器、它的版本、您如何配置它,以及调用站点(可能是内联的)周围的许多其他上下文。查看程序集并查看编译器的功能。一个好的资源是你的代码由于很多原因不能编译。值得一提的是,编译器应该能够内联对
func
的调用,但我怀疑它只有在call\u func
本身是内联的情况下才会这样做。通常,您无法可靠地推断优化,请始终检查asm。在本例中,FWIW Clang和GCC都内联了这些函数,但它们可能并不总是这样做。顺便说一句,functor
是函数对象。重载了运算符()()
的类。你已经用函子标记了这个问题。但您所使用的都是函数指针。还要注意的是,使用静态成员函数不需要实例化类的对象。一个好的资源是你的代码由于很多原因不能编译。值得一提的是,编译器应该能够内联对func
的调用,但我怀疑它只有在call\u func
本身是内联的情况下才会这样做。通常,您无法可靠地推断优化,请始终检查asm。在本例中,FWIW Clang和GCC都内联了这些函数,但它们可能并不总是这样做。顺便说一句,functor
是函数对象。重载了运算符()()
的类。你已经用函子标记了这个问题。但您所使用的都是函数指针。还请注意,您不需要实例化类的对象来使用静态成员函数。