ilkel türde sabit referans geçen bir kayıt mı?düşünün işlev parametresi olarak aşağıdaki işlevi
cevap
Bu, tamamen platform ve derleyiciye bağımlıdır ve argümanların bir işleve nasıl aktarıldığıdır.
Bu özellikler programın çalıştığı sistemin ABI'sında tanımlanmıştır; Bazılarının çok sayıda kaydı vardır ve bu nedenle bunları esas olarak kullanır. Bazıları hepsini yığının üstüne itiyor. Bazıları onları N-th parametresine kadar karıştırır.
Yine, güvenemeyeceğiniz bir şeydir; Yine de birkaç şekilde kontrol edebilirsiniz. C++ dilinin bir kayıt konsepti yoktur.
Daha önce değinildiği gibi, optimizasyonlar derleyici ve platform bağımlıdır. Bununla birlikte, iyi bir optimizasyon derleyicisini kullanırken genellikle gün başına bir dizi optimizasyonun olmasını bekledik. Örneğin, sorunuza cevap vermek için, vb
, tahsisi kayıt bit vardiya mümkün olduğunda sürekli çarpımı ve bölünmeler dönüştürerek, fonksiyon inlining güvenebilir
misiniz Modern x86-64 derleyicileri kadar akıllı olmak Öncelik türü bir kayıt içine sığabiliyorsa, önceliği argümanını referans yerine değerle iletir?
Sadece bunu deneyeceğim.
- GCC latest (without inlining)
- CLANG 3.5.1 (without inlining) Bu kodudur
:
template<typename T>
T square(const T& num) {
return num * num;
}
int sq(int x) {
return square(x);
}
GCC -O3
, -O2
ve -O1
güvenilir bu gerçekleştirmek için kendini gör optimizasyonu. Öte yandan, 3.5.1, Clang 3.5.1, bu optimizasyonu gerçekleştiriyor gibi görünmemektedir.
Böyle bir optimizasyonda sayılır mı? Her zaman ve kesinlikle değil - C++ standardı bunun gibi bir optimizasyonun ne zaman gerçekleşebileceği hakkında hiçbir şey söylemiyor. Pratikte, GCC kullanıyorsanız, '' un gerçekleşmesi için optimizasyonun olmasını bekleyebilirsiniz.
Böyle bir optimizasyonun gerçekleştiğinden kesinlikle emin olmak istiyorsanız, template specialization'u kullanmak isteyeceksiniz.
Derleyici, optimizasyonu yapabilir, ancak zorunlu değildir.(Değer geçirerek doğru olduğu) http://www.boost.org/doc/libs/1_55_0/libs/utility/call_traits.htm
call_traits<T>::param_type
ile const T&
değiştirilmesi:
Yani kod olabilir:
template <class T, class Priority>
void MutableQueue<T, Priority>::update(call_traits<T>::param_type item,
call_traits<Priority>::param_type priority)
{
...
}
- 1. düşünün karakteri aşağıdaki Char * örnek
- 2. neden planlama işlevi işlev yürütmeyi geciktirmiyor? Aşağıdaki
- 3. Açısal modeli işlev parametresi olarak kullanma
- 4. Bir işlev parametresi
- 5. Babel: ES6 işlev parametresi türleri
- 6. Operatörü, işlev şablon parametresi olarak değiştir
- 7. Diziyi Lua'da işlev parametresi olarak geçirme?
- 8. PL/SQL işlev parametresi
- 9. Meteor .helpers işlev parametresi
- 10. PUT aşağıdaki istirahat denetleyicisi düşünün değişken
- 11. Şablon şablon parametresi işlevi
- 12. C++: Yinelenen türün bir işlev parametresi olarak nasıl iletileceği
- 13. Realm alt sınıfını özel işlev parametresi olarak kullan
- 14. Liste parametresi olarak sorgu parametresi
- 15. SFINAE işlevi ile bir işlev isminden önce ve aşağıdaki isimle
- 16. düşünün multiprocessing.Managers
- 17. JavaScript işlev parametresi geçiren dizi
- 18. Neden arkadaş üyesi işlevi otomatik olarak işlev şablonu olarak tanınmıyor?
- 19. Bir işlev parametresi, işlev gövdesinde belirtmeden nasıl kullanılabilir?
- 20. qore'daki işlev parametresi kapsamı nedir?
- 21. konsol kodlama olarak Unicode ayarlanırken "parametresi yanlış" aşağıdaki hatayı alıyorum
- 22. dizinin başlatma birimi işlev parametresi olarak (C-dizisi) mümkün mü?
- 23. Genel işlev işaretçisi şablon parametresi olarak nasıl kullanılır?
- 24. Hata mesajı "şablon parametresi olarak geçirilen şablon işlevi tanımsız başvuru"
- 25. İşlev parametresi: benim ana fonksiyonunda nesnelerin
- 26. Scala'da işlev parametresi için varsayılan değeri ayarla
- 27. şablonlu işlev geçici olarak
- 28. ES6 yıkıcı işlev parametresi - adlandırma kök nesnesi
- 29. İşlev şablonunun açık uzmanlaştırmasında şablon parametresi nasıl çıkarılır?
- 30. libusb callback_in işlevi C++ 'da bir sınıfın üyesi olarak işlev
, yani, evet şüpheli. Ancak, uygulama harici modüllere maruz kalıyorsa, ABI gereksinimlerini karşılamalıdır - bu durumda referans bir referanstır. Genel olarak ilkellere referanslardan kaçınmak istersiniz - ve bunu yapmanın yolları vardır. – davmac
Tahminimce, "T" tipi bir örnek bir kayıt defterine sığabiliyorsa, derleyici kopya ile geçecektir. Aksi takdirde, muhtemelen değişkenleri işaretçi ile geçirir. –
Clang derleyici ile basit bir test yaptım. Derleyici gerçekten optimizasyonları yapıyor gibi görünüyor. Temel olarak, ABI gereksinimlerine uyan bir optimize edilmiş sürüm (işlevi satır içi veya değere göre geçirme gibi) ve bir sürümü (kullanılmayan ve yalnızca kodda oturur) oluşturur. –