inline fonksiyon ve makro arasındaki fark.

Başlatan Klein, 18 Haziran 2013, 20:33:29

Klein

Bir işi makro ile yapmak yerine inline fonksiyon olarak tanımlamak, ne gibi farklara neden olur?

Kabil ATICI

Kullandığın programı bilmiyorum ama; macrolar ile fonksiyon arasındaki fark en azından benim kullandığım programlar açısından  (assambler için)

fonksiyon: derlemeden sonra programın her yerinden çağrılır ve kullanılır.
macro ise: macro bloğu derleme esnasında programın neresinde kullanıldıysa oraya konarak derlenir. birden fazla kullanıldıysa, birden fazla yere konarak...
ambar7

z

Klein

Macro ile define ile yapilan tanimdan mi bahsediyorsun?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

fonksiyonları sormuyorum. Macro yerine inline fonksiyon kullanmanın yaratacağı farkı soruyorum.
inline fonksiyonlar da makrolar gibi davranır. Her çağırıldığında , çağrı kodu yerine fonksiyonun kodlarını koyar.
Sorduğum soru daha detay bir soru. Makro yerine inline fonksiyon kullanırsak üretilen kod aynı mı? olur bazı farklar var mıdır? varsa bu farklar nedir?


mesaj birleştirme:: 18 Haziran 2013, 21:23:01

evet hocam.

Tagli

Inline fonksiyonun önemli bir avantajının derleme sırasında parametrelerin türünün kontrol edilmesi olduğunu okumuştum bir yerde galiba. Bu durum, bazı hataların çalışma anında değil de derleme anında bulunmasına yardımcı olabilir. Sanırım aynı durum dönüş değerleri için de geçerli.
Gökçe Tağlıoğlu

SpeedyX

inline fonksiyonu farklı bir .c dosyası içinde kullanamazsınız, ayrıca fonksiyon olduğu için normal optimizasyona giriyordur büyük ihtimal. Macro ise genelde çok büyük kod içermediği için optimize edilmiyordur diye tahmin ediyorum. Bunun dışında macro ya göre daha rahat büyük kod parçaları yazabilirsiniz, kısaca macro max 3-5 satırlık kodlar barındıran tanımlar içindir.

CLR

Arasındaki fark inline fonksiyon bir bütündür yani macro'daki do-while(0) gibi hepsi bir kere çalıştırılır ama macro(do-while'sız) içindeki her satır kod ayrı bir parçadır. Mesela

if(x==2)
  inlinefonksiyon();  // tüm inline çalıştırılır

if(x==3)
  tanımlanmismacro();  // macrodaki ilk satır çalıştırılır.
   
Knowledge and Experience are Power

t2

Alıntı yapılan: CLR - 19 Haziran 2013, 00:11:08

if(x==3)
  tanımlanmismacro();  // macrodaki ilk satır çalıştırılır.


Bence macroda 500 satır olsa hepsi çalışır içinde ne olduğu önemli değil,   tanımlanmismacro(); diye çağırdın mı bu fonksiyon içinde ne varsa çalışacaktır.

CLR

Alıntı yapılan: t2 - 19 Haziran 2013, 01:29:37
Bence macroda 500 satır olsa hepsi çalışır içinde ne olduğu önemli değil,   tanımlanmismacro(); diye çağırdın mı bu fonksiyon içinde ne varsa çalışacaktır.

Macro ve fonksiyon başka şeylerdir, "tanımlanmismacro(); diye çağırdın mı bu fonksiyon içinde ne varsa çalışacaktır" ifadesi yanlış, macroya fonksiyon diyorsun.

hemde denemesi bedeva,

if'te küme parantezi  varsa tüm satırlar, yoksa tek satır çalışır. Bu C'nin temel kurallarındandır. Aşağıdaki linkten öğrenebilirsin.

http://www.cprogramming.com/tutorial/cpreprocessor.html

if(xxx)
    tek satır çalışır

if(xxx){
    küme parantezi arasındaki herşey çalıştırılır
}
Knowledge and Experience are Power

Icarus

macro'lar daha esnek, fonksiyonlar değil.
Ör: Macrolar fonksiyon üretebilirler hatta nested fuction üretebilirler (ki aslında C++'da nested function yoktur ama bazı numaralarla eklenebilir)
Unutulmaması gereken ise eğer macrolarda bir hata yaparsanız derleyici sizi uyarmaz. Fonksiyonlarda yaparsanız "warning... warning ..."

fatih6761

Makrolarda makro içeriği kullanıldığı yere doğrudan yerleştirilir. Bu işlem preprocessor sırasında gerçekleşir.  Başka bir olasılık yoktur.
inline fonksiyon ise gerektiğinde çağrıldığı yerde çalıştırılacak demektir. Uygun iyileştirme parametreleri açıksa ve derleyici, yerinde çağırmanın daha iyi olacağına karar vermişse inline fonksiyon derlendikten sonra kodda çağrıldığı yere yerleşir. Bu olay Optimize for Size durumunda (gcc için -Os parametresi verilmişse) gerçekleşmez. Çünkü kod parçasının kopyalanması daha çok yer kaplar.
Diğer iyileştirme düzeylerinde ise call/jump/branch ve push/pop komutlarında kaybedilen süreyi azaltmak için yerine yerleştirilir. Parametre denetimi de bir avantajıdır. Ancak her birinin yeri ayrıdır, hata ayıklarken makrolar kafa karıştırabilir ancak inline fonksiyonlar yerli yerinde durur,
diyebilirim. Benim bildiklerim bu kadar. Değerli hocalarım eksiğim/yanlışım varsa tamamlarlar...

bocek

belgeler.com'dan alıntı..

Alıntı yapılan: belgeler.com link=http://www.belgeler.com/blg/2d2u/c
inline ile yapılmak istenen makro ile yapılmak istenenle aynıdır. Makro ön işlemci tarafından açılırken inline fonksiyonlar derleme modülü tarafından açılır. inline fonksiyonlar ile makrolar aynı amaçlar için kullanılmalarına karşın inline fonksiyonlar makrolara göre çok daha kullanışlı ve sağlamdır. Örneğin: Makrolar ++ ve –- operatörleriyle çağırılamadığı halde (şüpheli kod oluşabilir), inline fonksiyonlar güvenli bir biçimde çağırılabilir. Çünkü inline fonksiyonlarda önce parametre ifadesi değerlendirilir, sonra açma işlemi gerçekleştirilir. Tabii inline fonksiyonlar normal bir fonksiyon gibi yazılıp çağırılırlar. Operatörlerin önceliğinden oluşacak problemler derleyici tarafından zaten giderilirler. inline fonksiyon parametrelerini parantez içerisine almaya gerek yoktur. inline fonksiyonlar diğer fonksiyonlarda olduğu gibi tür dönüştürmesi ve tür bakımından derleyicinin denetiminden geçerler. Yani inline fonksiyonlarda error‟ler ortaya çıkabilir, böylece kod açılmadan hatalar tespit edilir. Yani daha sağlamdır. Bu nedenlerden dolayı C++‟ta neredeyse makro hiç kulanılmaz. Hep inline fonksiyonlar kullanılır.
1 ya da 0. işte 'bit'ün mesele..

Klein

Özelllikle son iki cevap, aradığım cevaplardı.