Devatisimin nasıl işleyeceğini görmek için bu kısa programı yazdım. derleyici doğru tip anlamak mümkün olmalıdır: Derleyici devirtualization, çok akıllı değil mi?
#include <iostream>
using std::cout;
using std::endl;
class Base
{
public:
void foo() { cout << "Base::foo" << endl; }
virtual void bar() { cout << "Base::bar" << endl; }
virtual ~Base() = default;
};
class Child : public Base
{
public:
void foo() { cout << "Child::foo" << endl; }
void bar() { cout << "Child::bar" << endl; }
};
int main()
{
Base* obj = new Child;
obj->foo();
obj->bar();
delete obj;
}
https://gcc.godbolt.org/ gcc 5.3 ve çınlama 3.7 kullanılarak
-O2 -std=c++11
ile derlenmiştir. çıktı ne
ne derleyici her şeyi optimize edebilmek olmasıdır - gcc inlines foo()
, clang foo()
için çağrı yapar ve devirtualizes ve inlines bar()
çağrısı yaparken bar()
sanal çağrı yapar. bunun yerine obj->bar();
ve sonra obj->foo();
ararsanız
arada, derleyiciler optimize sorunum yok - clang hem aramaları inlines ve gcc yerine sanal bir ve inline foo()
ait bar()
normal çağrı yapar.
Bu davranışı herkes açıklayabilir mi?
bu soru garip. Neye cevap vermemiz gerekiyor? GCC Clang'dan daha mı kötü? bir zamanlar derleyiciler bir şeyler anlayabilirler, bazen özlerler. Clang daha yeni ve bu tür optimizasyonları desteklemek için sıfırdan inşa edildi. –
Hayır, sanal olmayan çağrının önce yapılması durumunda, bu kötü optimizasyonun ötesinde özel bir şey olup olmadığını merak ediyorum. Devirtualizasyonu bozan bazı optimizasyonlar zaten yapıldı mı? – cailinscath
http://hubicka.blogspot.de/2014/04/devirtualization-in-c-part-5-feedback.html gcc için ilginç arka plan bilgileri sağlar. Bu onu uygulayan gcc geliştiricisinden devirtualization hakkında makaleler ciddi bir bütündür. Gcc'e "-fwhole-program" veya "-fsuggest-final-method" eklemeyi denediniz mi? – Jens