跳到主要內容

發表文章

目前顯示的是 2月, 2020的文章

Devirtualization and TDD

Devirtualization and TDD Devirtualization (去虛擬化) Devirtualization 是 C++ 編譯器的一種最佳化,舉個例子: struct foo { virtual ~ foo ( ) { } virtual int bar ( ) = 0 ; } ; struct food : foo { int bar ( ) final { return 2 ; } } ; struct fool : foo { int bar ( ) override { return 3 ; } } ; int test ( food & f ) { return f . bar ( ) ; } int test ( fool & f ) { return f . bar ( ) ; } test(food& f) 用 -O2 編譯後產生的組語是 test(food&): mov eax, 2 ret 而 test(fool& f) 則產生 test(fool&): mov rax, QWORD PTR [rdi] mov rax, QWORD PTR [rax+16] cmp rax, OFFSET FLAT:fool::bar() jne .L6 mov eax, 3 ret .L6: jmp rax 差別在於前者用了 final 而後者使用 override , final 可以告訴編譯器 food::bar 不會再被衍生型別覆寫,因此不需要查找 vtable 而直接呼叫 food::bar 。 final 也可以用來敘明類別不會被其他類別繼承。例如: struct foot final : foo { /* impl */ } ; 以上可以發現,能套用 devirtualization 的