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
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
Nasıl bir uygulama veya bir işlemin as...
C bir uygulama çıktığınızda, malloc-ed...
jQuery eklenti şablonu - en iyi uygula...
VM ve Java Dalvik Bellek Modeli (Andro...
Nasıl Android Uygulama bellek kullanım...