c++ - c++ 中的 final 关键字是否允许额外的编译器优化?

标签 c++ inheritance virtual compiler-optimization final

我在考虑虚拟电话及其工作方式。我知道虚拟调用可以在编译时对值类型进行内联和硬编码。如果指针类型属于声明为 final 的类(如 c# 中的 sealed),这是否允许编译器执行相同的操作?

这在当前的编译器中做了很多,还是只是理论上的/太小而无需担心?

最佳答案

是的,如果虚函数或类被声明为 final,调用可以被去虚化。例如,给定

struct B {
  virtual void f() = 0;
};

struct D1 : B {
  virtual void f();
};

struct D2 : B {
  virtual void f() final;
};

struct D3 final : D1 {};

void f1(D1 * d) { d->f(); }
void f2(D2 * d) { d->f(); }
void f3(D3 * d) { d->f(); }

Clang 在 -O1 或更高级别 generates这个大会:

f1(D1*):                              # @f1(D1*)
    movq    (%rdi), %rax
    jmpq    *(%rax)  # TAILCALL

f2(D2*):                              # @f2(D2*)
    jmp D2::f()              # TAILCALL

f3(D3*):                              # @f3(D3*)
    jmp D1::f()              # TAILCALL

请注意,f1 调用是通过 vtable 进行的,而 f2f3 中的调用是去虚拟化的。

关于c++ - c++ 中的 final 关键字是否允许额外的编译器优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28957312/

相关文章:

c++ - 开始 c++ : OOP Methodologies and more

c++ - 为什么这个虚方法返回真?

c# - 可以在虚方法中抛出 NotImplemented 异常吗?

java - 实现接口(interface)而不实现它

ios - NSCoding 的 Swift 通用方法

c++ - 在 C++ 中将主体添加到纯虚拟/抽象函数?

c++ - 检查模板类型是否在可用类型列表中

c++ - 为什么在 C 中直接将无符号转换为有符号会给出正确的结果?

c++ - 如何更改菜单文本

Java 接口(interface)合成方法生成,同时缩小返回类型