C ++ derleyicisi sanal üye aramaları optimize ediyor mu?

oy
-1

Ben büyük yeni C ++ proje oluşturma düşünüyorum. başlangıç ​​kolaydır - sadece basit pencere, belki SDL2, belki SFML, hatta belki WIN32. Peki, ne almalıyım? ben istiyorum herhangi bir pencere kullanmak çok daha güzel olmaz mı? çok kod değiştirmeden böylece diğer sınıflar bu pencerenin bağımsızdır?

Dedi, bitti! Basit bir pencere arayüzü kullanarak, her sınıf bir pencere gibi bir şey biliyor ve ben farklı türleri arasında seçim yapmak mümkün. Tek şart, bir temel sınıf olarak IWindow yaşıyor.

class IWindow {
  public:
    IWindow(std::string title, int posX, int posY, int width, int height);
    IWindow getHandle();
    void loop();
    bool toggleFullscreen();
    bool toggleFullscreen(bool fullscreen);
    int getWidth();
    int getHeight();
    int getPosX();
    int getPosY();
    //And so on ...
};

Ben sanal yöntemleri kullanmak zorunda çünkü Ama şimdi, her zaman benim sanal fonksiyon döngü oyun döngü tarafından çağrılır. Ve sanal fonksiyonlar yavaştır. Yaklaşık% 10, okudum.

derleyici benim pencere ne olacağını görmek mümkün değil midir? Hangi tip Of ondan olacak? o göremedim Jeah, bu programcı adam bu yüzden sadece her yerde yöntemleri var kullanırlar. Bu uygulamada bir SDL penceresi oluşturur? Ben ana döngü sırasında benim pencere tanımlayan ediyorum, demek ve asla değiştirmeyeceğim. Hiçbir şey dinamik bu. Bu önceden tahmin edilebilir.

Yani derleyici benim öngörülebilir sanal işlev çağrıları optimize edebiliyor? Her oyun döngü döngüsü değerlendirilecektir hangi Bunlar? Aşağıdaki pasajda gibi mi?

int main(int argc, char* argv[]) {
  //Creates a window derived from IWindow
  SDL::Window myWindow(Title, 0, 0, 300, 100);
  //Storing it as IWindow in a wrapper class
  Game myGame(&myWindow);
  //Game loop
  //myGame.run() calls the window's loop
  while (myGame.run()) {
    //... doing game stuff
  }
}

Böyle bir oyun sınıfı ile:

class Game {
  protected:
    IWindow* window;
  public:
    bool run() {
      //Calls the window's virtual loop method.
      //Will it be optimized? Any way to do so?
      this->window->loop();
    }
};

Sizin fikir ve deneyimlerini duymak güzel olurdu.

Darth Ay

Oluştur 27/11/2018 saat 18:12
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
2

C ++ derleyicisi sanal üye aramaları optimize ediyor mu?

Evet, bir derleyici derleme zamanında beton türünü belirlemek eğer sanal fonksiyon çağrıları de-sanallaştırmanıza mümkün olabilir.

Hayır, bir C ++ derleyicisi tüm sanal işlev çağrıları de-sanallaştırmanıza mümkün olmayacaktır.

Ve sanal fonksiyonlar yavaştır. Yaklaşık 10%

% 10 fark doğru olduğunu varsayarsak, o işlev çağrısı havai birkaç nano saniye seviyesinde bir yerlerde muhtemelen düşünün. Birkaç nano saniyelik% 10 çok değil. Bir oyun gibi yumuşak gerçek zamanlı simülasyon tek bir yineleme birçok, birçok nano saniye sığabilir.

derleyici benim pencere ne olacağını görmek mümkün değil midir?

Yani derleyici benim öngörülebilir sanal işlev çağrıları optimize edebiliyor?

Olabilir.

İlk olarak, çağrı run gerekir işaretçi atanan bağlamda içi genişletilebilir. Aksi takdirde sivri bir nesne hakkında herhangi bir varsayım yapamazsınız. Talimatı satır içi genişletilecek, bu işlev çağrılır aynı çeviri birimi tanımlanmalıdır (haricinde LTO bu gereksinimi kaldırmak mümkün olabilir).

Bundan başka, derleyici kanıtlamak mümkün olmalıdır windowbaşka bir nesneyi işaret yürütülmesi sırasında herhangi bir noktada değiştirilmez. Belgesi, döngü nasıl göründüğünü bağlı imkansız olabilir, ama kolay yapmak için basit bir yol var: işaretçi sabiti tanımlamak.

İster gelince sizin derleyici gelmez optimize ... Bilmiyorum. Ama derleyici yapar, bu yüzden (yani derlenmesini ve ne yaptığını görmek için isteyin) derleyici sorunuzu yönlendiren öneririz.

Cevap 27/11/2018 saat 18:34
kaynak kullanıcı

oy
0

en yorumlarımızı özetleyelim.

Sanal çağrılar pahalı, ancak işlemci bir desen algılayabilir eğer, onların çağıran maliyet Modern işlemciler içerisindeki belirleyicileri sayesinde azalma olur.

Şimdi, kodunuzu kontrol edelim:

int main(int argc, char* argv[]) {
  //Creates a window derived from IWindow
  SDL::Window myWindow("Title", 0, 0, 300, 100);
  //Storing it as IWindow in a wrapper class
  Game myGame(&myWindow);
  //Game loop
  //myGame.run() calls the window's loop
  while (myGame.run()) {
    //... doing game stuff
  }
}

Farz edelim Gamesanal sahiptir run. Bu durumda, derleyici bilir myGametiptedir Gameve doğrudan çağrı koyabilirsiniz runsanal tablonun içinden gitmek yerine işlevi.

Şimdi başka bir dosyada bu var:

class Game {
  protected:
    IWindow* window;
  public:
    bool run() {
      //Calls the window's virtual loop method.
      //Will it be optimized? Any way to do so?
      this->window->loop();
    }
};

Ne yazık ki, bu durumda, derleyici sadece bu dosya bakarak bilebilir şey yok ve bu çağrının olarak SDL::Windowsanal geçeceği rungelen IWindow.

İle Şimdi lto(bağlantı süresi optimizasyonu), derleyici onu anlamaya ve kodu de-sanallaştırmanıza mümkün olabilir, ama muhtemelen optimizasyon seçeneklerinin sayısı dosya sayısı hem de kombinasyonların sayısı ile büyüyecek etmeyeceksiniz.

Cevap 27/11/2018 saat 18:26
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more