2009-10-26 18 views
25

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?

+10

Ö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

+2

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

cevap

31

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.

+0

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). –

+1

'-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ı? –

+0

@AnT Derleyicinin yalnızca bir kez çağrılan bir işlevi belirtmesini nasıl önleyebiliriz. – bharath

7

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.

+2

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

+0

Tamam, Yorumunuza göre güncellenir, bunun için teşekkürler. – Marcin

3

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.

1
+0

, fonksiyonun esasen çoğaltılmasından ve hız için belleğin feda edilmesi bakımından pahalıdırlar. –

+1

@ 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

+0

* potansiyel olarak pahalı * –

1

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.