SORU
30 AĞUSTOS 2012, PERŞEMBE


C 11 lambda uygulama ve bellek modeli

Doğru C 11 kilitler ve std::function uygulanır, nasıl açısından düşünmek nasıl ve bellek nasıl kullanıldığı hakkında bilgi istiyorum.

Prematüre optimizasyonu inanmıyorum rağmen, dikkatli bir şekilde yeni bir kod yazarken seçimlerimi performans etkisini dikkate alarak bir alışkanlığı var. Ben de belirli olmayan bir bellek ayırma/kaldırma duraklar kaçınılmalıdır nerede ses sistemleri için gerçek zamanlı programlama, örneğin LED lamba ve adil bir miktar yapmak.

Bu nedenle kullanmak veya C Lambda kullanmak için ne daha iyi bir anlayış geliştirmek istiyorum.

Benim şimdiki anlayış yakalanan kapatılması lambda C tam bir geri arama gibi. Çevre ya da başvuru değeri ya da esir alınmış, ancak anonim bir nesne yığın üzerinde oluşturulur. Değer-kapatma işlevinden iade edilmelidir zaman, bir std::function sarılıyordu. Bu durumda kapatma bellek ne olacak? Kopyalanan bu öbek yığını mı? std::function serbest zaman serbest, yani, o std::shared_ptr gibi bir referans sayılır değil mi?

Gerçek zamanlı bir sistemde işleme boru hattı A->B oluşturulur, lambda fonksiyonları zinciri, devamı için bir argüman olarak B geçen yapabilirim sanırım. Bu durumda, A ve B kapanışları sonra tahsis edilecek. Bu yığın veya yığın için ayrılan olacak mı emin değilim. Ancak genel olarak bu güvenli gerçek zamanlı bir sistemi kullanmak gibi görünüyor. B oluşturur öte yandan bazı lambda C, döndüren fonksiyonu C hafızası gerçek zamanlı kullanım için kabul edilebilir olmayan ayrılmış olacak ve tekrar tekrar kaldırıldı.

-Kod sözde, bence DSP gibi bir döngü, gerçek zamanlı güvenli olacak. Bir argüman çağırır işleme bloğu A ve B, gerçekleştirmek istiyorum. Her ikisi de bu işlevleri 11* *nesneleri döndürmek, f çevre yığında depolandığı std::function bir nesne olur:

auto f = A(B);  // A returns a function which calls B
                // Memory for the function returned by A is on the heap?
                // Note that A and B may maintain a state
                // via mutable value-closure!
for (t=0; t<1000; t  ) {
    y = f(t)
}

Ve bence hangisi gerçek zamanlı kod kullanım için kötü olabilir:

for (t=0; t<1000; t  ) {
    y = A(B)(t);
}

Ve yığın bellek sanırım bir olasılıkla kapatılması için kullanılır:

freq = 220;
A = 2;
for (t=0; t<1000; t  ) {
    y = [=](int t){ return sin(t*freq)*A; }
}

İkinci durumda kapatılması döngünün her tekrarında yeni inşa edilmiş, ancak sadece bir işlev çağrısı gibi çünkü ucuz önceki örneğin aksine, yığın ayırma yapılır. Dahası, eğer bir derleyici "" kapatılması ve optimizasyon satır içi uygulaması yapmak. asansör acaba

Bu doğru mu? Teşekkür ederim.

CEVAP
30 AĞUSTOS 2012, PERŞEMBE


Benim şimdiki anlayış yakalanan kapatılması lambda C tam bir geri arama gibi. Çevre ya da başvuru değeri ya da esir alınmış, ancak anonim bir nesne yığın üzerinde oluşturulur.

Hayır;her zamanC bilinmeyen bir tür yığında ile oluşturulan nesne. Yakalama-daha az bir lambda olabilirdönüştürülmüşbir işlev işaretçisi (gerçi C çağırma kurallarına uygun olup uygulamaya bağlıdır), ama bu demek değilbir işlev işaretçisi.

Değer-kapatma işlevinden iade edilmelidir zaman, bir std sarılıyordu::fonksiyon. Bu durumda kapatma bellek ne olacak?

Lambda bir şey C 11 özel değil. Başka bir nesne gibi bir eşya. Lambda ifade yığında: bir değişkeni başlatmak için kullanılan bir geçici sonuçları

auto lamb = []() {return 5;};

lamb yığın nesne. Yapıcı ve yıkıcı. Ve bunun için C tüm kuralları takip edecek. lamb türü değerleri yakalanan/referanslar içerir; başka başka bir türün üyeleri nesnesi gibi bir nesne üyeleri olacak.

std::function bir verebilirsin:

auto func_lamb = std::function<int()>(lamb);

Bu durumda, bir alacakkopyalalamb değeri. Eğer lamb değer bir şey kaçırdıysa, bu değerler iki kopyası; lamb func_lamb biri olacaktı.

Geçerli kapsamı sona erdiğinde, func_lamb, lamb temizlik kurallarını başı olarak tahrip takip edilecektir değişkenleri yığını.

Kolayca öbek üzerinde tahsis.

auto func_lamb_ptr = new std::function<int()>(lamb);

std::function içeriğini hafızası gider tam olarak uygulanmasına bağlı olduğunu, ancak tür-silme std::function tarafından istihdam genellikle en az bir bellek ayırma gerektirir. Bu std::function'In kurucu bir ayırıcı alabilir. neden

Std zaman serbest::fonksiyon, yani, referans sayılan bir cinsel hastalık mı serbest::shared_ptr?

std::function depolarkopyalaonun içindekiler. Hemen hemen her function standart Kütüphanesi C tipi kullanır gibideğer semantiği. Böylece, copyable; kopyalandığında, function yeni nesneyi tamamen ayrıdır. Herhangi bir iç ayırmaları gerektiği daha tahsis ve kopyalama kalmadan transfer edilebilir, aynı zamanda hareketli.

Böylece başvuru saymaya gerek yok.

Devlet her şeyi doğru tahmin "bellek ayırma" eşittir "kötü gerçek zamanlı olarak kullanmak". kod

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AutoHotkey Tutorials

    AutoHotkey T

    29 Mayıs 2010
  • Jordie Jordan

    Jordie Jorda

    27 Ocak 2008