SORU
26 AĞUSTOS 2013, PAZARTESİ


Nasıl std::function uygulanır?

Kaynaklara göre buldum, birlambda ifadesiaslında üye olarak derleyici aşırı yüklü işlev çağrısı operatörü ve başvurulan değişkenleri olan bir sınıf oluşturarak uygulanır. Bu lambda ifadeleri boyutu değişir, ve yeterince başvurular boyutu olabilir değişkenleri verilen öneriyorkeyfi büyük.

std::function a olmalıdırboyutu sabitaynı türde bir Lambda dahil callables her türlü sarmak için mümkün olmalı , ama. Nasıl uygulanıyor? std::function dahili hedef gösterici kullanıyorsa, ne std::function örnek kopyalanmış veya taşınmış olur o zaman? Herhangi bir yığın ayırma var mı?

CEVAP
26 AĞUSTOS 2013, PAZARTESİ


std::function uygulama başka bir uygulama farklı olabilir, ama temel fikir türü-silme kullanıyor olması. Varken birden fazla yol yapıyor, düşünün bir önemsiz (optimal) çözüm olabilir gibi bu Basit Çince için özel bir durumda std::function<int (double)> uğruna sadelik):

struct callable_base {
   virtual int operator()(double d) = 0;
   virtual ~callable_base() {}
};
template <typename F>
struct callable : callable_base {
   F functor;
   callable(F functor) : functor(functor) {}
   virtual int operator()(double d) { return functor(d); }
};
class function_int_double {
   std::unique_ptr<callable_base> c;
public:
   template <typename F>
   function(F f) {
      c.reset(new callable(f));
   }
   int operator()(double d) { return c(d); }
// ...
};

Bu basit yaklaşım function temel nesne türü için unique_ptr sadece bir mağaza. Her biri farklı ** 10, yeni bir tür tabanı elde oluşturulur ve bu tür bir nesne ile kullanılan functor örneği dinamik olarak. std::function nesne her zaman aynı boyutta ve yığın farklı funktorlar için gerekli alanı tahsis edecek.

Gerçek hayatta performans avantajları sağlayan farklı iyileştirmeleri ama cevap zorlaştıracaktır. Türü olabilir küçük bir nesne optimizasyon, dinamik bir merkez tarafından değiştirilebilir bir serbest fonksiyon işaretçi alır eşleme olarak tartışmayı önlemek için bir seviye yönlendirme... ama fikir temelde aynı.


std::function kopyalarını nasıl davranması konusunda hızlı bir test dahili çağrı nesne kopyaları, devlet paylaşmaktan çok yapıldığını gösterir.

// g  4.8
int main() {
   int value = 5;
   typedef std::function<void()> fun;
   fun f1 = [=]() mutable { std::cout << value   << '\n' };
   fun f2 = f1;
   f1();                    // prints 5
   fun f3 = f1;
   f2();                    // prints 5
   f3();                    // prints 6 (copy after first increment)
}

Test f2 çağrı varlığın bir kopyasını yerine, bir başvuru alır gösterir. Eğer çağrılabilir varlık std::function<> farklı nesneler tarafından paylaşılan olsaydı, program çıktısı 5, 6, 7 olurdu.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ipsy

    ipsy

    1 EKİM 2012
  • megablueblaster

    megablueblas

    23 HAZİRAN 2006
  • Michael Neal

    Michael Neal

    2 Mayıs 2009