2012-02-13 32 views
13

Güncel bir hakem incelemesi sırasında, başka bir Yazılım Mühendisi, inline işlevinin (sınıfın dışında) yanı sıra bildirimde (sınıfın içinde) inline işlevinin olduğunu belirtmemizi önerir. Onun argümanı "satır içine işaretleyerek, bu yöntem olmayan bir satır içi yönteme göre çok daha hızlı yürütülecek olacağını söylüyor ve arayanlar yöntemine aşırı aramalar hakkında endişelenmenize gerek kalmamasıdır." olmasıdırSatır içi tanım ve bildirim

Bu doğru mu? Eğer bir sınıfın kullanıcısıysam, yönteme aşırı çağrıları gerçekten önemser miyim? Hem tanım hem de beyanda satır içi olarak listelenmesinde yanlış bir şey var mı? C++ FAQ devletler:

iyi uygulama: yalnızca sınıf vücut dışında tanımında.

Peki kim haklı burada? iki tamamen ilgisiz şeyler gibi geliyor

+6

inline' 'hakkında * * alakalı tek şey ODR muafiyet yaratmasıdır. –

+0

Doğru düzeltin :) –

+4

"*" Satır içi olarak işaretlediğinizde, bu yöntemin satır içi olmayan bir yöntemden daha hızlı gerçekleştirileceğini ve arayanların yönteme yapılan aşırı çağrılardan endişe duymadığını söylüyorsunuz. "* "Bu adam doğrudan __far__. Scary ... – ildjarn

cevap

9

. sınıfta beyanı ve sınıf gerekli değildir dışında tanımı hem de inline koyarak. Bildirimlerden birine koymak yeterlidir.

bir işlevi var tanımlanan bir .cpp dosyada inline ekleme hakkında konuşmak ve bu işlev bir public üyesi ise, o zaman bunu yapmamalı. inline işlevlerini çağıran kişilerin tanımlarının kendilerine görünür olması gerekir. C++ Standardı bunu gerektirir.

+0

Bu yüzden öneriniz, halka açıksa, satır içi ve Cpp dosyasında değil mi? Benim durumumda, bu halka açıktır. –

+0

@ 0A0D hayır bu benim tavsiyem değil. Ben ima ettiğim gibi, 'inline' işlevi çağırırsanız, işlev tanımının derleyiciye görünmesi gerekir (çağrının çevirme biriminde tanımlanması gerekir). Bunu sınıf tanımının içine veya dışına getirin ve daha sonra bunu açıkça 'satır içi' olarak işaretleyebilirsiniz (ve eğer sınıf tanımının dışına başlığa koyarsanız, aslında bunu yapmak zorundasınız). Sınıf tanımındaki işlevi tanımladığınızda "satır içi" kelimesini koymak gereksizdir. –

+0

Sadece bir şey düşünüldü .. başlıkta ve cpp dosyasında satır içi satırda değil, sınıf için cpp dosyasında bulunan ve başlıkta bulunmayan durum için gereksiz mi? Bu, hala anlamadığım –

8

Satır içi olarak işaretlediğinizde, bu yöntemin, satır içi olmayan bir yöntemden çok daha hızlı gerçekleştirileceğini ve arayanların yönteme yapılan aşırı çağrılardan endişelenmek zorunda olmadığını söylüyorsunuz.

saçmalık bu. fonksiyon aslında fiziksel olarak satır içine yerleştirilmiş olacağını garanti etmez bir işlev inline İşaretleme; Öyle olsa bile, işlevinizin "daha hızlı" olacağını garanti etmez. Olursam

tanımını inline yanı sıra beyanı işaretleyerek,

... yok bir şey, hakkında herhangi bir garantisi olmadığını senin kullanıcı davranarak sadece kafa karıştırıcı şeylersiniz Bir sınıf kullanıcısı, yönteme aşırı çağrıları gerçekten önemser mi?

Aslında değil. Anahtar kelime her zaman tek çözünürlüklü kuralının uygulanmasını etmek etkiler kullanarak bakılmaksızın inlining oluşup oluşmadığını ait nedense (için inline depolama zorlamak için gerektiğinde

Aslında, gerçekten, inline yazmalısın tek zaman Bu işlevsellik ve hellip; Aksi takdirde, derleyici satır içi hangi işlevlerin kullanılacağına karar verin ve devam edin. Bunun sonucu olarak, herhangi bir şeyi belgelediğini iddia etmek için anahtar kelimeyi kullanma konusunda endişelenmenize gerek yoktur.

+0

Bu durumda, yalnızca belirli bir değerin ayarlandığını ve doğru veya yanlış döndüğünü kontrol ediyorum. –

+2

@ 0A0D: Derleyiciniz bunu biliyor. Kullanıcılarınız, işlevin performans nedenleriyle belirtilip belirtilmediğini düşünürse, yanlış programlama yaparlar. :) –

+1

Bu cevap potansiyel olarak bana kafa karıştırıcı görünüyor. "Satır içi bir işlevin işaretlenmesi, işlevin fiziksel olarak belirtileceğini garanti etmez", ancak "satır içi yazmayı zorlamanız gerektiğinde satır içi yazmanız gereken tek zaman". Görünüşün, düz bir çelişki olmaksızın, "satır içi depolama" ve "fiziksel olarak çizili" arasındaki farkı açıklamalıyım. –