GCC, C++ kodunu derlerken, inline
anahtar sözcüğüyle işaretlenmeyen satır içi işlevleri seçerek hız için en iyi duruma getirmeyi dener mi?GCC satır içi C++ 'inline' anahtar sözcüğü olmadan çalışıyor mu?
cevap
Evet. Herhangi bir derleyici, iyi bir fikir olduğunu düşündüğünde herhangi bir işlevi satır içi serbest bırakabilir. GCC de bunu yapıyor.
-O2 en iyileştirme düzeyinde, derleyici, kodun boyutunu artırmayacaksa, yapacağı değerin (bir sezgisel kullanım) ve yapması gerektiğini düşündüğünde yapılır. -O3'te, derleyici kodun boyutunu artıracak olup olmadığına bakılmaksızın, yapmaya değer olduğunu düşündüğünde yapılır. Ek olarak, tüm optimizasyon düzeylerinde (etkinleştirilmiş optimizasyon), yalnızca bir kez çağrılan statik işlevler belirtilir.
GCC, '-finline-functions' "Satır içi olarak bildirilmese bile satır içi tüm işlevleri göz önünde bulundurun." 'Satır içi' ile bildirilen işlevlerin kod boyutunu daha büyük yapsalar bile satır içi için dikkate alınacağını tahmin ediyorum. "inline" dan derleyiciye olan ipucu geçersizdir.Ama bu, '-O2' ile anlam ifade etmeyecektir, çünkü sadece inline anahtar sözcüğüne sahipse kodu daha büyük kılan işlevleri geçersiz kılacaktır. -O3 'eski olurdu (Ben ipucu demek, "inline" anahtar kelimesinin başka amaçları vardır). –
'-O2' ile satır içi büyük olacak bir işlev oluşturmakta sorun yaşıyorum. Oluşturduğum her işlev -O3 ile belirtildiği gibi -O2 ile belirtilir.GCC, '-finline-small-function' ile ilgili olarak şunları ifade eder: "Vücudunun beklenen işlev çağrısı kodundan daha küçük olduğunda, işlevleri kendi aralarında bütünleştirin (böylelikle programın genel boyutu küçülür)". Bununla birlikte, -O2 ile bile derleme baktığımda, kodu daha büyük bir hale getirir. O3 inline ama O2'nin olmadığı bir örneğiniz var mı? –
@AnT Derleyicinin yalnızca bir kez çağrılan bir işlevi belirtmesini nasıl önleyebiliriz. – bharath
Evet, özellikle yüksek düzeyde optimizasyonunuz varsa etkinleştirin.
Bunu devre dışı bırakmak için derleyiciye sağlayabileceğiniz bir işaret var: -fno-inline-functions.
Aslında, -fno-satır içi işlevler otomatik satır içi çizgileri ve satır içi satırları bastırır. all inlining (source: http://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Switches-for-gcc.html) – KeatsPeeks
Tamam, Yorumunuza göre güncellenir, bunun için teşekkürler. – Marcin
Eğer '-finline-functions' veya '-O3' kullanırsanız, satır içi işlevleri olacaktır. Ayrıca, ne kadar çizgi çizdiğini ayarlamak için '-finline_limit = N' kullanabilirsiniz.
, fonksiyonun esasen çoğaltılmasından ve hız için belleğin feda edilmesi bakımından pahalıdırlar. –
@ Ape-inago: Operatörler ve erişimciler gibi küçük ortak işlevler için, satır içi sürümleri genellikle daha az maliyetli olduğundan, bir işlev çağrısı etrafında kayıtların kaydedilip geri yüklenmesinden daha az sayıda yönerge alması daha az sürer. – Adisak
* potansiyel olarak pahalı * –
Evet, öyle, o da bir satıriçi olmayan üretecektir rağmen "-O3 Bu seçenek böyle fonksiyon inlining olarak, daha pahalı optimizasyonları açar" inline
olmayan static
olmayan işlev gövdesi, diğer çeviri birimlerinden gelen çağrılar için gerekli olduğundan işlev görür.
inline
işlevleri için, işlev herhangi bir çeviri biriminde kullanıldığında bir işlev gövdesi sağlamada bir hata olduğundan, bu bir problem değildir.
- 1. satır içi işlev gcc
- 2. GCC C++ ve satır içi montaj kodu?
- 3. GCC satır içi derleme kodunda% c ne anlama geliyor?
- 4. __forceinline satır içi nasıl?
- 5. Kotlin inline anahtar kelime
- 6. C++: extern ve satır içi işlevler
- 7. Windows'ta gcc -fdiagnostics-color çalışıyor mu?
- 8. Yöntem, satır içi yöntem
- 9. 'Satır içi' ve tırnak değerlendirmesini kullanırken (+) ve (-) arasındaki tutarsız davranış
- 10. Satır içi satır içi satır
- 11. Satır içi blok neden taşma yaparken farklı çalışıyor?
- 12. satır içi işlev bağlayıcı hatası
- 13. debugger anahtar sözcüğü
- 14. ruby anahtar sözcüğü argümanları
- 15. Kalıtım ve satır içi?
- 16. Satır içi tanım ve bildirim
- 17. ORA-00926: C: VALUES anahtar sözcüğü eksik C#
- 18. Django 1.8 - FieldError: Anahtar sözcüğü
- 19. En kısa satır içi koleksiyon başlatıcısı? C#
- 20. Paragraf inline ile inline
- 21. Python'u satır içi kabuktan satır içi yürütme
- 22. Inlineiting Sabit satır içi satır içi paketleri
- 23. Agresif satır içi varlığında C++ profili?
- 24. Satır içi derlemede (GCC, IA-32) çift kesinlikli sayılarla çalışma
- 25. Inline MathJax PageDown
- 26. IE ekran satır içi blok
- 27. GCC, Clang ve Intel Compiler'da tek bir makroyla satır içi zorlanıyor musunuz?
- 28. Bash "satır içi" şart
- 29. Bildirimde satır içi kullanılamadı Hata oluştu C2054
- 30. Ekran: satır içi çalışmıyor
Özelliğe göre, C++'daki inline anahtar sözcüğünün, aynı ada sahip derleyici optimizasyonu ile ilgisi yoktur. Anahtar kelime basitçe, linker fonksiyonun çoklu tanımlarını görmeyi beklemesi gerektiği anlamına gelir. Bu, inline * optimizasyon * 'un daha kolay olmasını sağlar (çünkü tam tanım birden fazla çeviri biriminde görünür hale getirilebilir), ancak bu, elde ettikleri kadar yakındır. Derleyici, "inline" olarak işaretlenmeyen satır içi işlevleri ve "inline" olarak işaretlenmiş işlevlerin derleyici tarafından zorunlu olarak belirtilmemiş olması gibi satır içi işlevleri olabilir. – jalf
Sınıf tanımında tanımlanan yöntemlerin (ör. {...}; 'arasında, anahtar sözcük olmadan bile, varsayılan olarak satır içi olduğunu unutmayın. – MSalters