Saya menelusuri Stack Overflow untuk mengetahui kelebihan/kekurangan fungsi makro v. fungsi inline.
Saya menemukan diskusi berikut: Pro dan Kontra dari Fungsi makro/metode sebaris yang berbeda di C
...tapi itu tidak menjawab pertanyaan utama saya.
Yaitu, berapa overhead di c dari penggunaan fungsi makro (dengan variabel, kemungkinan pemanggilan fungsi lain) v. fungsi inline, dalam hal penggunaan memori dan kecepatan eksekusi?
Apakah ada perbedaan overhead yang bergantung pada kompiler? Saya memiliki icc dan gcc yang dapat saya gunakan.
Cuplikan kode yang saya modularkan adalah:
double AttractiveTerm = pow(SigmaSquared/RadialDistanceSquared,3);
double RepulsiveTerm = AttractiveTerm * AttractiveTerm;
EnergyContribution +=
4 * Epsilon * (RepulsiveTerm - AttractiveTerm);
Alasan saya untuk mengubahnya menjadi fungsi/makro inline adalah agar saya dapat memasukkannya ke dalam file c dan kemudian mengkompilasi fungsi/makro lain yang serupa, tetapi sedikit berbeda secara kondisional.
e.g.:
double AttractiveTerm = pow(SigmaSquared/RadialDistanceSquared,3);
double RepulsiveTerm = pow(SigmaSquared/RadialDistanceSquared,9);
EnergyContribution +=
4 * Epsilon * (RepulsiveTerm - AttractiveTerm);
(perhatikan perbedaannya pada baris kedua...)
Fungsi ini adalah inti dari kode saya dan dipanggil ribuan kali per langkah dalam program saya dan program saya melakukan jutaan langkah. Jadi saya ingin memiliki overhead yang SEDANG mungkin, oleh karena itu mengapa saya membuang-buang waktu mengkhawatirkan overhead inlining v. mengubah kode menjadi makro.
Berdasarkan diskusi sebelumnya saya sudah menyadari pro/kontra lainnya (kemandirian tipe dan kesalahan yang dihasilkan darinya) makro... tapi yang paling ingin saya ketahui, dan saat ini tidak saya ketahui adalah KINERJA.
Saya tahu beberapa dari Anda para veteran C akan memiliki wawasan yang luar biasa untuk saya!!
MACRO()
di parser tempat fungsi ini sering dipanggil.inline
dan__forceinline
hanya mendapat peningkatan 50% dibandingkan panggilan fungsi biasa tetapiMACROs
menghasilkan 100%. (melacak kinerja dalam siklus) - Jadi menurut saya, jika fungsi inline pendek dan sederhana, cobalah makro dan benchmark. - person CodeAngry   schedule 05.04.2014