gpt4 book ai didi

c++ - 虚函数效率与 'final'关键字

转载 作者:太空宇宙 更新时间:2023-11-03 10:43:37 56 4
gpt4 key购买 nike

考虑一个程序,它有一个 Foo 类,其中包含一个声明如下的函数 Foo::fn:

virtual void fn();

Foo 的子类 Bar。将像这样声明 Bar::fn:

virtual void fn() override final;

导致 BarBar 的子类中对 fn 的调用更加高效,或者它只是保留 的子类禁止 覆盖 fn?如果使用 final 使调用更高效,定义 Bar::fn 的最简单、最有效的方法是什么,使其功能与 Foo 完全相同: :fn?

最佳答案

如果fn定义为 finalBar , 编译器可以将调用分派(dispatch)给 fn通过指针或对 Bar 的引用静态的,因为它知道 Bar::fn是最终的重写。例如这个程序片段:

struct Foo {
virtual void fn();
};

struct Bar : Foo {
void fn() final override;
};

void with_foo(Foo& o) { o.fn(); }
void with_bar(Bar& o) { o.fn(); }

编译为(See gcc.godbolt.org for details):

with_foo(Foo&):
subq $8, %rsp
movq (%rdi), %rax
call *(%rax)
addq $8, %rsp
ret

with_bar(Bar&):
subq $8, %rsp
call Bar::fn()
addq $8, %rsp
ret

电话with_foo通过 vtable 动态调度(call *(%rax) 是间接调用),但是 with_bar 中的调用静态发送到 Bar::fn() .

最简单的制作方法Bar::fn成为 Foo::fn 的最终覆盖者不改变行为是将其定义为静态调用 Foo::fn :

struct Bar : Foo {
void fn() final override { Foo::fn(); }
};

关于c++ - 虚函数效率与 'final'关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28332918/

56 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com