Neden Lambda daha düz fonksiyonları daha derleyici tarafından optimize edilebilir?
Kitabında The C Standard Library (Second Edition)
Nicolai Josuttis Lambda daha düz fonksiyonları daha derleyici tarafından optimize edilebilir olduğunu belirtir.
Buna ek olarak, C onlardan daha iyi optimize Lambda Derleyiciler olağan işlevleri. (Sayfa 213)
Bu yüzden mi?
Bir fark daha fazla olmamalı satır içi uygulaması gelince düşündüm. Aklıma gelen tek sebep Derleyiciler Lambda ile daha yerel bir bağlam olabilir ve böyle fazla varsayım ve daha fazla iyileştirmeler gerçekleştirebilirsiniz.
CEVAP
Sebebi Lambda olmasıdırişlevi nesneleriçok işlevi bir şablon geçirmeden yeni bir işlev nesnesi için özel olarak başlatılamadı. Derleyici basit satır içi lambda arayabilirsiniz böylece.
Fonksiyonlar için, diğer taraftan, eski uyarı geçerlidir: bir fonksiyonişaretçiişlev şablonu geçti ve Derleyiciler geleneksel olarak sorunları işlev işaretçileri üzerinden aramalar satır içi uygulaması var. Onlarolabilirteorik olarak inlined, ama eğer çevredeki işlevi de inlined.
Örnek olarak, aşağıdaki işlev şablonu göz önünde bulundurun:
template <typename Iter, typename F>
void map(Iter begin, Iter end, F f) {
for (; begin != end; begin)
*begin = f(*begin);
}
Lambda ile arama: bunun gibi
int a[] = { 1, 2, 3, 4 };
map(begin(a), end(a), [](int n) { return n * 2; });
Bu örnekleme sonuçları (derleyici tarafından oluşturulan):
template <>
void map<int*, _some_lambda_type>(int* begin, int* end, _some_lambda_type f) {
for (; begin != end; begin)
*begin = f.operator()(*begin);
}
... derleyici _some_lambda_type::operator ()
bilir ve bu çağrı içi basit olabilir. (Ve işlevi ile map
çağırmaherhangi birdiğer her lambda lambda farklı türü vardır beri map
yeni bir örnekleme oluşturur.)
Ama bir işlev işaretçisi adında bir örnekleme aşağıdaki gibi görünüyor
template <>
void map<int*, int (*)(int)>(int* begin, int* end, int (*f)(int)) {
for (; begin != end; begin)
*begin = f(*begin);
}
... ve burada f
puan için farklı bir adres için her arama için map
ve böylece derleyici olamaz satır içi aramalar için f
sürece çevre aramak map
var da inlined böylece derleyici karar f
belirli bir fonksiyon.
Neden gcc eğer hız yerine BOYUTU için ...
Neden bir derleyici yazmanın işlevsel ...
Python kullanmak için daha çok tercih ...
Neden sıralanmamış bir dizi daha hızlı...
Neden baskı "B" baskı " ...