在派生类中调用虚函数的最佳方法是什么,以便编译器可以内联或以其他方式优化调用?
例:
class Base {
virtual void foo() = 0;
};
class Derived: public Base {
virtual void foo() {...}
void bar() {
foo();
}
};
Run Code Online (Sandbox Code Playgroud)
我希望打电话foo()进来bar()随时打电话Derived::foo().我的理解是,调用将导致vtable查找,并且编译器无法优化它,因为可能有另一个继承自Derived的类.
我可以显式调用Derived::foo()但是如果Derived中有许多虚函数调用则会变得冗长.我也发现令人惊讶的是我找不到很多在线资料来解决我认为是常见的情况(一个'最终'派生类调用虚拟方法)所以我想知道我是在滥用虚函数还是过度优化.
该怎么做?停止过早优化和坚持foo(),吸收和使用Derived::foo(),还是有更好的方法?
我有一个Fortran 90子程序,它接受一个函数作为参数,我想将该函数的修改版本传递给另一个子程序.我希望程序看起来像这样:
subroutine foo(f, ...)
real :: pt(2), dir(2)
interface
function f(x) result(y)
real, intent(in) :: x(2)
real :: y
end function f
end interface
pt = ...
dir = ...
!! Somehow create g(x) = f(pt + x*dir)
call bar(g)
end subroutine foo
subroutine bar(g)
interface
function g(x) result(y)
real, intent(in) :: x
real :: y
end function g
end interface
!! Do stuff with g
end subroutine bar
Run Code Online (Sandbox Code Playgroud)
当'g'只需要使用普通变量而不是函数时,我已经设法做了类似的事情.在那种情况下,我使用全局变量将其作为全局函数,并将其分配给'foo'中的那些全局变量.但是,我找不到一种方法来将'f'变为全局,或将其分配给全局函数.
任何人有任何想法如何做到这一点?解决方案可以像你想要的那样hacky.
c++ ×1
fortran ×1
fortran90 ×1
function ×1
inheritance ×1
inline ×1
optimization ×1
virtual ×1