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
    是函数对象。重载了
    运算符()()
    的类。你已经用函子标记了这个问题。但您所使用的都是函数指针。还请注意,您不需要实例化类的对象来使用
    静态成员函数。